Cette page est faite pour les débutants. Je suggère néanmoins au vrai débutant de se faire la main avec la macro Loto.
Tous les exemples présentés ne sont qu'une évolution progressive d'une même macro. Le nombre de mots-clés augmente progressivement. Exceptées les lignes de déclarations API indispensables, je vous suggère d'essayer de comprendre le but de ces listings. Enfin, sachez que pour obtenir un résultat identique, il existe de nombreuses solutions.
Vous pouvez si vous le désirez copiez comme ci-dessous. Les exercices sont numérotés. Vous pourrez donc les inscrire les uns à la suite des autres. Pour les lancer, modifiez la ligne 4.
IMPORTANT : Les listings complets présentés ici ont des numéros de ligne, par ex : 12. Dans la pratique ces numéros n'existent pas mais aident pour les explications.
REM ***** BASIC *****
'
Sub Main
Exemple01
End Sub
'
'
Sub Exemple01
REM Déclarations API indispensables
Dim oDocument As Object, oSheet As Object, oCell As Object
oDocument = ThisComponent
oSheet=oDocument.Sheets.getByName("Feuille1")
'
oCell = oSheet.getCellByPosition(0,0)
oCell.setString("DUPONT")
oCell = oSheet.getCellByPosition(0,1)
oCell.setString("DURAND")
End Sub
Ce premier exemple, volontairement simple, on écrit les noms de DUPONT et
DURAND dans 2 cellules à la suite. Les lignes 14 et
16 servent à sélectionner les cellules avec
getCellByPosition(Colonne, Ligne) et les lignes
15 et 17 à écrire
les textes avec setString.
Sub Exemple02
REM Déclarations API indispensables
Dim oDocument As Object, oSheet As Object, oCell As Object
oDocument = ThisComponent
oSheet=oDocument.Sheets.getByName("Feuille1")
'
Dim Nom(10) As String ' Tableau de 10 noms maximum
'
Nom(1)= "DUPONT"
Nom(2)= "DURAND"
'
oCell = oSheet.getCellByPosition(0,0)
oCell.setString(Nom(1))
oCell = oSheet.getCellByPosition(0,1)
oCell.setString(Nom(2))
End Sub
Avec l'exemple 02, le résultat est identique au précédent,
mais les données sont déclarées dans un tableau
Dim
et les noms sont écrits dans les variables Nom() de type
String.
Notez le changement d'écriture des lignes 13
et 15.
Sub Exemple03
REM Déclarations API indispensables
Dim oDocument As Object, oSheet As Object, oCell As Object
oDocument = ThisComponent
oSheet=oDocument.Sheets.getByName("Feuille1")
'
Dim Nom(10) As String ' Tableau de 10 noms maximum
Dim i As Integer
'
Nom(1)= "DUPONT"
Nom(2)= "DURAND"
'
' Ecriture avec une boucle For.. To.. Next
For i = 1 To 10
oCell = oSheet.getCellByPosition(0, i - 1)
oCell.setString(Nom(i))
Next i
End Sub
Avec l'exemple 03, le résultat est identique au précédent, mais on
commence à simplifier l'écriture des données. S'il y avait plusieurs
centaines de noms, le travail serait difficile. Avec une boucle
For.. Next
(lignes 14 et 17), il
suffit de 2 lignes insérées. Notez à nouveau les changements dans
les lignes 15 et 16, les
valeurs sont remplacées par la variable i de type
Integer.
Sub Exemple04
REM Déclarations API indispensables
Dim oDocument As Object, oSheet As Object, oCell As Object
oDocument = ThisComponent
oSheet=oDocument.Sheets.getByName("Feuille1")
'
Dim NmbDonnees As Integer
NmbDonnees = 10
Dim Nom(10) As String, Prenom(10) As String
Dim DateNaissance(NmbDonnees) As Date
Dim i As Integer
'
Nom(1)= "DUPONT"
Nom(2)= "DURAND"
Nom(3)= "LERADIN"
Nom(4)= "LERICHE"
Nom(5)= "LEPAUVRE"
Prenom(1) = "Antoine"
Prenom(2) = "Marie"
Prenom(3) = "Pierre"
Prenom(4) = "Paul"
Prenom(5) = "Henri"
DateNaissance(1) = "07/09/1990"
DateNaissance(2) = "12/03/1945"
DateNaissance(3) = "17/11/1983"
DateNaissance(4) = "03/08/1979"
DateNaissance(5) = "29/02/2000"
'
'
' Ecriture des données
For i = 1 To 10
oCell = oSheet.getCellByPosition(0, i - 1)
oCell.setString(Nom(i))
oCell = oSheet.getCellByPosition(1, i - 1)
oCell.setString(Prenom(i))
oCell = oSheet.getCellByPosition(2, i - 1)
oCell.setString(DateNaissance(i))
Next i
End Sub
Peu d'évolution, mais on rajoute les prénoms et dates de naissances. Notez
la déclaration des dates de naissances ligne 10 au
format date. Au résultat,
2 choses anormales. Vous avez bien entendu vu l'affichage 00:00:00 en absence de date.
Autre erreur plus difficile à détecter. Les dates sont affichées à
gauche. Pourquoi ? Elles sont interprétées comme étant des textes.
Sub Exemple05
REM Déclarations API indispensables
Dim oDocument As Object, oSheet As Object, oCell As Object
oDocument = ThisComponent
oSheet=oDocument.Sheets.getByName("Feuille1")
'
Dim NmbDonnees As Integer
NmbDonnees = 10
DimNom(10) As String, Prenom(10) As String
DimDateNaissance(NmbDonnees) As Date
Dim i As Integer
'
Nom(1)= "DUPONT"
Nom(2)= "DURAND"
Nom(3)= "LERADIN"
Nom(4)= "LERICHE"
Nom(5)= "LEPAUVRE"
Prenom(1) = "Antoine"
Prenom(2) = "Marie"
Prenom(3) = "Pierre"
Prenom(4) = "Paul"
Prenom(5) = "Henri"
DateNaissance(1) = "07/09/1990"
DateNaissance(2) = "12/03/1945"
DateNaissance(3) = "17/11/1983"
DateNaissance(4) = "03/08/1979"
DateNaissance(5) = "29/02/2000"
'
' Ecriture des données
For i = 1 To 10
oCell = oSheet.getCellByPosition(0, i - 1)
oCell.setString(Nom(i))
oCell = oSheet.getCellByPosition(1, i - 1)
oCell.setString(Prenom(i))
If Nom(i) ‹›"" Then
oCell = oSheet.getCellByPosition(2, i - 1)
oCell.setValue(DateNaissance(i))
Endif
Next i
End Sub
Pour éviter l'affichage des dates de naissances inexistantes, on considère que
s'il n'y a pas de nom, il n'y a pas de date. Donc, si la variable Nom() est non
vide (‹›"") en ligne 35, dans ce cas
uniquement on écrit la date de naissance. De plus en ligne 37
on utilise setValue et non plus SetString.
On affiche une valeur (la date est une valeur) et non plus une chaîne de caractères.
En revanche les dates sont affichées sous forme de nombre qu'il faudra formater au
format date.
Sub Exemple06
REM Déclarations API indispensables
Dim oDocument As Object, oSheet As Object, oCell As Object
oDocument = ThisComponent
oSheet=oDocument.Sheets.getByName("Feuille1")
'
Dim NmbDonnees As Integer
NmbDonnees = 10
DimNom(10) As String, Prenom(10) As String
DimDateNaissance(NmbDonnees) As Date
Dim Ville(NmbDonnees) As String, CodePostal(NmbDonnees) As Long
Dim i As Integer
'
Nom(1)= "DUPONT"
Nom(2)= "DURAND"
Nom(3)= "LERADIN"
Nom(4)= "LERICHE"
Nom(5)= "LEPAUVRE"
Prenom(1) = "Antoine"
Prenom(2) = "Marie"
Prenom(3) = "Pierre"
Prenom(4) = "Paul"
Prenom(5) = "Henri"
DateNaissance(1) = "07/09/1990"
DateNaissance(2) = "12/03/1945"
DateNaissance(3) = "17/11/1983"
DateNaissance(4) = "03/08/1979"
DateNaissance(5) = "29/02/2000"
Ville(1) = "75000 Paris"
Ville(2) = " 33000 Bordeaux "
Ville(3) = "17000 la rochelle"
Ville(4) = "69000 LYON"
Ville(5) = "75000 paris"
'
' Ecriture des données
For i = 1 To 10
oCell = oSheet.getCellByPosition(0, i - 1)
oCell.setString(Nom(i))
oCell = oSheet.getCellByPosition(1, i - 1)
oCell.setString(Prenom(i))
If Nom(i) ‹›"" Then
oCell = oSheet.getCellByPosition(2, i - 1)
oCell.setValue(DateNaissance(i))
Endif
oCell = oSheet.getCellByPosition(3,
i - 1)
oCell.setString(Ville(i))
Next i
End Sub
Principale évolution, on ajoute les noms de villes et les codes postaux. Problème,
ils sont dans une seule colonne qu'il faudra séparer (dans l'exemple suivant). Notez les
déclarations ligne 11, de type
Long pour le Code Postal.
Sub Exemple07
REM Déclarations API indispensables
Dim oDocument As Object, oSheet As Object, oCell As Object
oDocument = ThisComponent
oSheet=oDocument.Sheets.getByName("Feuille1")
'
Dim NmbDonnees As Integer
NmbDonnees = 10
DimNom(10) As String, Prenom(10) As String
DimDateNaissance(NmbDonnees) As Date
Dim Ville(NmbDonnees) As String, CodePostal(NmbDonnees) As Long
Dim i As Integer
Dim Longueur As Integer
Dim PartieGauche As Variant, PartieDroite As Variant
Les données Villes et Codes postaux sont séparées. On cherche la longueur de
la chaîne de caractères avec Len, ligne 47 puis on extrait les
parties gauche et droite avec les fonctions Left et Right, lignes 48 et 49. On convertit le code postal de forme chaîne de
carctères en valeur numérique, ligne 51. A la
lecture des résultats vous notez quelques imperfections : erreur du code postal
33000 (pourquoi ?) et affichage bizarre (majuscules / minuscules) des noms de ville.
L'exemple suivant va corriger des défauts. Les variables PartieGauche et PartieDroite
sont déclarées de type
Variant. En fait, dans ce cas, un type
String serait identique.
Sub Exemple08
REM Déclarations API indispensables
Dim oDocument As Object, oSheet As Object, oCell As Object
oDocument = ThisComponent
oSheet=oDocument.Sheets.getByName("Feuille1")
'
Dim NmbDonnees As Integer
NmbDonnees = 10
DimNom(10) As String, Prenom(10) As String
DimDateNaissance(NmbDonnees) As Date
Dim Ville(NmbDonnees) As String, CodePostal(NmbDonnees) As Long
Dim i As Integer, a As Integer
Dim Longueur As Integer
Dim PartieGauche As Variant, PartieDroite As Variant
Dim Caractere As String, CaracterePrecedent As String
IfCaracterePrecedent = " " Or CaracterePrecedent = "" Then
Caractere = Ucase(Caractere)
Else
Caractere = Lcase(Caractere)
Endif
Mid(PartieDroite, a, 1, Caractere)
If a = Len(PartieDroite) Then Exit Do
Loop
Return
'
End Sub
En ligne 48 la fonction Trim va supprimer les espaces indésirables (ligne 33) qui posent des problèmes ultérieurs. En ligne 52, le programme est aiguillé vers un sous-programme avec Gosub. Ce sous-programme NomPropre va transformer le 1er caractère ou tout caractère suivant un espace d'une chaîne en majuscule avec UCase,
ligne 71. Tous les autres caractères seront transformés en minuscules avec LCase, ligne 73.
Les lignes 62 et 63 initialisent les variables. Un oubli (ligne 62) risque de provoquer des erreurs. L'oubli de a = 0, ligne 63 est beaucoup plus grave (voir suite).
La ligne 65 est un compteur. En 66, on extrait les caractères un par un avec Mid. En 68, on extrait le caractère précédent. C'est la raison de sa position dans un If.. Endif (lignes 67 et 69). En effet on ne peux chercher le caractère précédent qu'à partir du second, sinon, erreur.
Analysez bien la ligne 70. On cherche un espace avec " " ou (avec Or) rien avec
"". Notez bien un espace entre guillemets dans le premier cas et aucun dans le second. Ces 2 cas correspondent bien aux cas, après un espace ou en début de chaîne de caractères.
La ligne 75 va transformer la chaîne avec Mid. Notez la différence importante de Mid en lecture 66 et 68 et en écriture ligne 75.
La ligne 76 est importante. Elle permet de sortir d'une boucle Do.. Loop avec Exit Do. Si cette ligne est absente, le programme boucle sans fin sur lui même. Ceci explique également l'importance de la ligne 63 qui réinitialise la variable compteur.
Et maintenant, à vos claviers.
Ce site n'est plus mis à jour. Merci aux nombreux visiteurs depuis 2003. Consultez le Wiki LibreOffice.