I. Introduction▲
I-A. Qu'est-ce qu'une macro ?▲
Une macro est une suite d'instructions dans un langage qui servira à les exécuter. Une macro est souvent utilisée pour automatiser des tâches répétitives ou longues.
Les macros pourront être écrites en oBasic, BeanShell, JavaScript ou Python. Toutefois, tout dépendra de votre environnement et de ce qui est installé par défaut sur le poste. Voici des captures sous différents environnements.
Sous Windows :
Sous Ubuntu :
Sous OpenSuse :
Sous Debian :
Comme vous pouvez le voir avec les captures précédentes, cela varie d'une distribution à une autre, mais dans ce tutoriel, je n'aborderai que la notion du oBasic, qui est commune à tous.
I-B. Où trouver l'éditeur de macros ?▲
L'éditeur de macro est accessible par la commande « Outils », « Macros », « Gérer les macros » et « LibreOffice Basic… » :
La fenêtre suivante apparaît :
Dans la partie gauche de la fenêtre se trouvent les emplacements de macros existantes :
- « Mes macros » contiendra toutes les macros qui seront rattachées au profil de la personne qui est connectée ;
- « Macro LibreOffice » contiendra toutes les macros qu'il sera possible d'utiliser avec la suite ;
- « Sans nom1 » (ou le nom d'un fichier) contiendra toutes les macros qu'il sera possible d'utiliser avec le fichier (si vous envoyez le fichier à quelqu'un, les macros contenues dans le fichier pourront être utilisées).
Dans la partie droite, c'est la liste des macros qui sont disponibles.
Pour ouvrir l'éditeur, deux cas possibles suivant où vous vous trouvez :
- soit vous voulez modifier ou compléter une macro, dans ce cas, il faudra cliquer sur « Gérer » et sélectionner la macro correspondante ;
- soit vous voulez créer une nouvelle macro et dans ce cas cliquer sur « Nouveau ».
La fenêtre de l'éditeur est la suivante :
L'exécution des macros est bloquée par défaut, ceci afin d'éviter des programmes indésirables ou des virus.
Vous trouverez ici une procédure pour activer correctement les macros.
II. L'éditeur oBasic▲
L'éditeur oBasic se présente comme toute application :
La fenêtre peut être décomposée en quatre parties :
- la première partie contient toutes les commandes (menus, barres d'outils) ;
- la deuxième contient les catalogues ;
- la troisième contient le code ;
- et la quatrième contient les témoins.
II-A. Menus et barres d'outils▲
Elle contient, entre autres, toutes les fonctions d'édition standard aux suites, mais aussi des barres d'outils, comme celle-ci, dont nous nous servirons souvent :
- (1) permet de sélectionner le module souhaité ;
- (2) compile le code et permet d'identifier les erreurs ;
- (3) exécute la macro sélectionnée ;
- (4) arrête une macro en cours, il est aussi possible de faire Maj+Ctrl+S ;
- (5) exécute une procédure et s'arrête ;
- (6) exécute l'étape et s'arrête à l'exécution suivante ;
- (7) retourne la précédente macro active ;
- (8) insère un point d'arrêt ;
- (9) gère les points d'arrêt avec une boîte de dialogue ;
- (10) active ou désactive le témoin ;
- (11) met en évidence le texte entre deux parenthèses ;
- (12) ouvre le texte source oBasic dans la fenêtre ;
- (13) enregistre le code ;
- (14) permet d'importer une boîte de dialogue.
II-B. Les catalogues▲
Un catalogue est l'emplacement où seront stockées les différentes macros. Il en existe trois types :
- « Mes macros et boîtes de dialogue » : il s'agit du catalogue contenant vos macros, celles-ci seront alors disponibles pour toutes les applications ;
- « Macros et boîtes de dialogue… » : il s'agit du catalogue dédié aux macros fournies avec LibO et AOO ou les extensions ;
- le catalogue du document chargé, mais la macro ne sera alors disponible qu'avec le fichier.
II-C. Le code▲
Cette partie contiendra tout le code. C'est dans cette zone que nous pourrons saisir de nouveaux codes ou modifier les codes existants.
Les différents codes seront identifiés par des noms de fonctions (nous en reparlerons par la suite), ce qui nous permettra de nous déplacer facilement d'une fonction à une autre pour modifier ou rajouter du code dedans.
Il sera aussi possible dans cette zone de visualiser les points d'arrêt. Un point d'arrêt permet d'arrêter le déroulement d'une macro sans la stopper au niveau de l'opération qui se trouve juste avant. Par exemple :
Il vous suffira de vous mettre sur la ligne 7, de cliquer sur la commande (1) et le point rouge (2) apparaîtra sur la ligne. Si vous lancez votre macro, toutes les commandes qui précèdent les points sont exécutées.
Les points d'arrêt sont très utiles quand vous devez chercher une erreur dans votre code.
II-D. Le témoin▲
Cette partie permet d'observer la valeur des variables au cours de l'exécution du code.
III. Quelques principes▲
Comme dit précédemment, une macro est un bout de code écrit, dans notre cas, en oBasic. Elle exécutera une suite d'opérations dans le fichier Tableur.
Voici, au travers de quelques exemples, ce qu'il est possible de faire...
Exemple 1, nous affichons un message :
Sub
Exemple_1
Dim
Txt as
String
Txt =
"Hello World !"
MsgBox
Txt
End
Sub
Nous obtiendrons donc :
Exemple 2, nous affichons un message que nous aurons saisi :
Sub
Exemple_2
Dim
Txt as
String
Txt =
InputBox
(
"Titre"
)
MsgBox
Txt
End
Sub
La fenêtre suivante apparaît :
Nous saisissons le texte souhaité :
Nous obtenons donc :
Dans les deux exemples précédents, nous avons utilisé les balises Sub, mais nous aurions pu utiliser les balises Function.
Les deux codes fonctionnent également avec les autres applications de la suite bureautique.
Nous venons de voir comment se compose une macro :
- une balise d'ouverture et une de fermeture ;
- la déclaration des variables, cette étape est importante, car elle est souvent source d'erreurs ;
- le contenu de la macro qui décrit les différentes opérations à réaliser.
IV. Onglets▲
IV-A. Lister les onglets présents dans le classeur▲
Voici le code qui nous permettra de lister tous les onglets contenus dans le classeur :
Sub
ListerOnglet
(
)
Dim
monDocument As
Object
Dim
lesFeuilles as
Object
Dim
uneFeuille As
Object
Dim
nbF as
Integer
monDocument =
ThisComponent
lesFeuilles =
monDocument.Sheets
nbF =
lesFeuilles.Count
For
i =
0
to
nbF-
1
uneFeuille =
lesFeuilles
(
i)
MsgBox
uneFeuille.Name
Next
End
Sub
Explications :
-
il est recommandé de définir toutes les variables, cela permet d'en connaître le type pour la suite :
Très utile, quand le code est long. Vous pourrez ainsi vous souvenir du type que vous aviez associé à la variable.
Si vous ne la définissez pas, la valeur par défaut est Object.
-
monDocument = ThisComponent : permet d'indiquer que nous allons travailler sur le document. Nous aurions pu mettre monDocument = CurrentComponent, cette première notation nous indique que c'est le document actif qui est utilisé. La seconde notation permet d'intervenir sur un autre document ;
-
lesFeuilles = monDocument.Sheets : permet d'indiquer que nous allons travailler sur les différentes feuilles de l'onglet ;
-
lesFeuilles.Count : donne le nombre de feuilles que contient le classeur ;
- For i = 0 to nbF-1 … Next : va nous permettre de balayer toutes les feuilles :
Attention, le premier onglet correspond à la valeur 0, et il ne faudra pas oublier de retirer 1 au nombre total, sinon vous obtiendrez une belle erreur.
- uneFeuille = lesFeuilles(i) : permet de sélectionner une feuille ;
- MsgBox uneFeuille.Name : nous donne le nom de la feuille.
Créez un nouveau classeur, insérez-y différents onglets, copiez le code dans une nouvelle macro et exécutez-la.
IV-B. Quelques commandes▲
IV-B-1. Sélectionner une feuille par son nom▲
Sub
SelectionnerFeuille
(
)
Dim
monDocument As
Object
Dim
lesFeuilles as
Object
Dim
uneFeuille As
Object
monDocument =
ThisComponent
lesFeuilles =
monDocument.Sheets
uneFeuille =
lesFeuilles.getByName
(
"Feuille1"
)
...
End
Sub
IV-B-2. Détecter la feuille active▲
Sub
FeuilleActive
(
)
...
Msgbox
ThisComponent.CurrentController.ActiveSheet.Name
...
End
Sub
IV-B-3. Renommer une feuille▲
Sub
RenommerFeuille
(
)
Dim
monDocument As
Object
Dim
lesFeuilles as
Object
Dim
uneFeuille As
Object
monDocument =
ThisComponent
lesFeuilles =
monDocument.Sheets
uneFeuille =
lesFeuilles.getByName
(
"Feuille1"
)
uneFeuille.Name
=
"Feuille renommée"
...
End
Sub
IV-B-4. Insérer/supprimer une feuille▲
Sub
Inserer_Supprimer
(
)
Dim
monDocument As
Object
Dim
lesFeuilles as
Object
Dim
uneFeuille As
Object
Dim
indexFeuille As
Integer
monDocument =
ThisComponent
lesFeuilles =
monDocument.Sheets
'Pour insérer une feuille après la feuille sélectionnée
uneFeuille =
lesFeuilles.getByName
(
"Feuille1"
)
indexFeuille =
uneFeuille.RangeAddress.Sheet
lesFeuilles.insertNewByName
(
"Feuille insérée"
, indexFeuille+
1
)
'Pour supprimer une feuille
lesFeuilles.removeByName
(
"Feuille1"
)
End
Sub
V. Cellules▲
Une des particularités du Tableur de LibreOffice (ou OpenOffice) est que vous ne pourrez pas sélectionner une colonne ou une ligne, vous serez obligé de sélectionner une zone.
V-A. Sélectionner une cellule▲
V-A-1. Une cellule▲
Il existe trois façons de sélectionner une cellule :
Sub
SelectionnerCellule
(
)
Dim
monDocument As
Object
Dim
lesFeuilles as
Object
Dim
maFeuille As
Object
Dim
maCellule As
Object
monDocument =
ThisComponent
lesFeuilles =
monDocument.Sheets
maFeuille =
lesFeuilles.getByName
(
"Feuille1"
)
'Par son adresse
maCellule =
maFeuille.getCellRangeByName
(
"A10"
)
'Par son nom (si vous avez donné un nom à une cellule)
maCellule =
maFeuille.getCellRangeByName
(
"Cellule_nommée"
)
'Par sa position (colonne, ligne)
maCellule =
maFeuille.getCellByPosition
(
1
,10
)
End
Sub
V-A-2. Une zone▲
Sub
SelectionnerZone
(
)
Dim
monDocument As
Object
Dim
lesFeuilles as
Object
Dim
maFeuille As
Object
Dim
maCellule As
Object
monDocument =
ThisComponent
lesFeuilles =
monDocument.Sheets
maFeuille =
lesFeuilles.getByName
(
"Feuille1"
)
'Par son adresse
maCellule =
maFeuille.getCellRangeByName
(
"A1:A10"
)
'Par son nom (si vous avez donné un nom à une zone)
maCellule =
maFeuille.getCellRangeByName
(
"Zone_nommée"
)
'Par sa position (colonne, ligne)
maCellule =
maFeuille.getCellRangeByPosition
(
1
,1
,1
,10
)
End
Sub
V-A-3. La cellule active▲
Sub
CelluleActive
(
)
Dim
maCellule As
Object
maCellule =
ThisComponent.CurrentSelection
MsgBox
maCellule.CellAddress.Column
MsgBox
maCellule.CellAddress.Row
MsgBox
maCellule.CellAddress.Sheet
End
Sub
V-A-4. La dernière cellule d'une ligne▲
Sub
DerniereCellule
(
)
Dim
monDocument As
Object
Dim
lesFeuilles as
Object
Dim
maFeuille As
Object
Dim
maCellule As
Object
Dim
maPosition As
Object
monDocument =
ThisComponent
lesFeuilles =
monDocument.Sheets
maFeuille =
lesFeuilles.getByName
(
"Feuille1"
)
maPosition =
maFeuille.createCursor
maPosition.gotoEndOfUsedArea
(
False
)
MsgBox
maPosition.RangeAddress.EndRow
+
1
'le +1 permet de se positionner sur la dernière ligne vide
End
Sub
V-B. Écrire dans une cellule▲
Il y a plusieurs façons d'écrire dans une cellule suivant ce que vous voulez y mettre.
V-B-1. Une valeur numérique▲
Sub
EcrireValeur
(
)
Dim
monDocument As
Object
Dim
lesFeuilles as
Object
Dim
maFeuille As
Object
Dim
maCellule As
Object
monDocument =
ThisComponent
lesFeuilles =
monDocument.Sheets
maFeuille =
lesFeuilles.getByName
(
"Feuille1"
)
maCellule =
maFeuille.getCellRangeByName
(
"A1"
)
maCellule.Value
=
1
'Vous pouvez y mettre aussi un calcul
End
Sub
V-B-2. Du texte▲
Sub
EcrireTexte
(
)
Dim
monDocument As
Object
Dim
lesFeuilles as
Object
Dim
maFeuille As
Object
Dim
maCellule As
Object
monDocument =
ThisComponent
lesFeuilles =
monDocument.Sheets
maFeuille =
lesFeuilles.getByName
(
"Feuille1"
)
maCellule =
maFeuille.getCellRangeByName
(
"A1"
)
maCellule.String
=
"Texte que vous voulez mettre dans la cellule"
End
Sub
V-B-3. Une formule▲
Sub
EcrireFormule
(
)
Dim
monDocument As
Object
Dim
lesFeuilles as
Object
Dim
maFeuille As
Object
Dim
maCellule As
Object
monDocument =
ThisComponent
lesFeuilles =
monDocument.Sheets
maFeuille =
lesFeuilles.getByName
(
"Feuille1"
)
maCellule =
maFeuille.getCellRangeByName
(
"A101"
)
'Pour une formule en anglais
maCellule.Formula
=
"=SUM(A1:A100)"
'Pour une formule avec la langue du poste en français
maCellule.FormulaLocal
=
"=SOMME(A1:A100)"
End
Sub
V-C. Lire une cellule▲
Tout comme pour écrire dans une cellule, la lecture est soumise aux mêmes conditions.
Pour les exemples qui vont suivre, nous allons saisir les données suivantes dans un classeur :
- A1 contient la valeur 1 ;
- A2 contient le texte « Test » ;
- A3 contient la formule « =SOMME(B1:B6) » (dans mon cas la somme fera 21).
Il n'y aura aucun message d'erreur si vous vous trompez sur la commande. Car la valeur que vous obtenez est « 0 ».
V-C-1. Une valeur▲
Sub
LireValeur
(
)
Dim
monDocument As
Object
Dim
lesFeuilles as
Object
Dim
maFeuille As
Object
Dim
maCellule As
Object
monDocument =
ThisComponent
lesFeuilles =
monDocument.Sheets
maFeuille =
lesFeuilles.getByName
(
"Feuille1"
)
maCellule =
maFeuille.getCellRangeByName
(
"A1"
)
Msgbox
maCellule.Value
maCellule =
maFeuille.getCellRangeByName
(
"A2"
)
Msgbox
maCellule.Value
maCellule =
maFeuille.getCellRangeByName
(
"A3"
)
Msgbox
maCellule.Value
End
Sub
Ce qui nous donne pour les différentes Msgbox :
- 1 ;
- 0 ;
- 21.
V-C-2. Du texte▲
Sub
LireTexte
(
)
Dim
monDocument As
Object
Dim
lesFeuilles as
Object
Dim
maFeuille As
Object
Dim
maCellule As
Object
monDocument =
ThisComponent
lesFeuilles =
monDocument.Sheets
maFeuille =
lesFeuilles.getByName
(
"Feuille1"
)
maCellule =
maFeuille.getCellRangeByName
(
"A1"
)
Msgbox
maCellule.String
maCellule =
maFeuille.getCellRangeByName
(
"A2"
)
Msgbox
maCellule.String
maCellule =
maFeuille.getCellRangeByName
(
"A3"
)
Msgbox
maCellule.String
End
Sub
Ce qui nous donne pour les différentes Msgbox :
- 1 ;
- Test ;
- 21.
V-C-3. Une formule▲
Sub
LireFormule
(
)
Dim
monDocument As
Object
Dim
lesFeuilles as
Object
Dim
maFeuille As
Object
Dim
maCellule As
Object
monDocument =
ThisComponent
lesFeuilles =
monDocument.Sheets
maFeuille =
lesFeuilles.getByName
(
"Feuille1"
)
maCellule =
maFeuille.getCellRangeByName
(
"A1"
)
Msgbox
maCellule.Formula
maCellule =
maFeuille.getCellRangeByName
(
"A2"
)
Msgbox
maCellule.Formula
maCellule =
maFeuille.getCellRangeByName
(
"A3"
)
Msgbox
maCellule.Formula
End
Sub
Ce qui nous donne pour les différentes Msgbox :
- 1 ;
- Test ;
- SUM(B1:B6).
Si vous aviez mis FormulaLocal, le résultat aurait été =SOMME(B1:B6).
V-D. Effacer le contenu d'une cellule▲
La suppression agit de la même façon que la lecture, elle tient compte du type. Nous allons conserver les mêmes données qu'avant :
- A1 contient la valeur 1 ;
- A2 contient le texte « Test » ;
- A3 contient la formule « =SOMME(B1:B6) ».
V-D-1. Une valeur▲
Sub
EffacerValeur
(
)
Dim
monDocument As
Object
Dim
lesFeuilles as
Object
Dim
maFeuille As
Object
Dim
maCellule As
Object
Dim
aEffacer As
Long
monDocument =
ThisComponent
lesFeuilles =
monDocument.Sheets
maFeuille =
lesFeuilles.getByName
(
"Feuille1"
)
aEffacer =
com.sun.star.sheet.CellFlags.VALUE
maCellule =
maFeuille.getCellRangeByName
(
"A1"
)
maCellule.clearContents
(
aEffacer)
maCellule =
maFeuille.getCellRangeByName
(
"A2"
)
maCellule.clearContents
(
aEffacer)
maCellule =
maFeuille.getCellRangeByName
(
"A3"
)
maCellule.clearContents
(
aEffacer)
End
Sub
Ce qui nous donne pour les différentes cellules :
- A1 ne contient plus aucune donnée ;
- A2 contient « Test » ;
- A3 contient « =SUM(B1:B6) ».
V-D-2. Du texte▲
Sub
EffacerTexte
(
)
Dim
monDocument As
Object
Dim
lesFeuilles as
Object
Dim
maFeuille As
Object
Dim
maCellule As
Object
monDocument =
ThisComponent
lesFeuilles =
monDocument.Sheets
maFeuille =
lesFeuilles.getByName
(
"Feuille1"
)
aEffacer =
com.sun.star.sheet.CellFlags.STRING
maCellule =
maFeuille.getCellRangeByName
(
"A1"
)
maCellule.clearContents
(
aEffacer)
maCellule =
maFeuille.getCellRangeByName
(
"A2"
)
maCellule.clearContents
(
aEffacer)
maCellule =
maFeuille.getCellRangeByName
(
"A3"
)
maCellule.clearContents
(
aEffacer)
End
Sub
Ce qui nous donne pour les différentes cellules :
- A1 contient « 1 » ;
- A2 ne contient plus aucune donnée ;
- A3 contient « =SUM(B1:B6) ».
V-D-3. Une formule▲
Sub
EffacerFormule
(
)
Dim
monDocument As
Object
Dim
lesFeuilles as
Object
Dim
maFeuille As
Object
Dim
maCellule As
Object
monDocument =
ThisComponent
lesFeuilles =
monDocument.Sheets
maFeuille =
lesFeuilles.getByName
(
"Feuille1"
)
aEffacer =
com.sun.star.sheet.CellFlags.FORMULA
maCellule =
maFeuille.getCellRangeByName
(
"A1"
)
maCellule.clearContents
(
aEffacer)
maCellule =
maFeuille.getCellRangeByName
(
"A2"
)
maCellule.clearContents
(
aEffacer)
maCellule =
maFeuille.getCellRangeByName
(
"A3"
)
maCellule.clearContents
(
aEffacer)
End
Sub
Ce qui nous donne pour les différentes cellules :
- A1 contient « 1 » ;
- A2 contient « Test » ;
- A3 ne contient plus aucune donnée ;
V-D-4. Tout supprimer▲
Il existe une façon de tout effacer d'un seul coup :
Sub
EffacerTout
(
)
Dim
monDocument As
Object
Dim
lesFeuilles as
Object
Dim
maFeuille As
Object
Dim
maCellule As
Object
monDocument =
ThisComponent
lesFeuilles =
monDocument.Sheets
maFeuille =
lesFeuilles.getByName
(
"Feuille1"
)
aEffacer =
com.sun.star.sheet.CellFlags.VALUE
+
_
com.sun.star.sheet.CellFlags.STRING
+
_
com.sun.star.sheet.CellFlags.FORMULA
maCellule =
maFeuille.getCellRangeByName
(
"A1"
)
maCellule.clearContents
(
aEffacer)
maCellule =
maFeuille.getCellRangeByName
(
"A2"
)
maCellule.clearContents
(
aEffacer)
maCellule =
maFeuille.getCellRangeByName
(
"A3"
)
maCellule.clearContents
(
aEffacer)
End
Sub
Toutes les cellules A1, A2 et A3 sont maintenant vides.
VI. Conclusion▲
Nous venons de voir quelques-unes des fonctions qui vous permettront de commencer la programmation avec oBasic. La liste des fonctions est longue, vous pouvez toutes les découvrir dans cet ouvrage : Programmation OpenOffice.org et LibreOffice.
À vous maintenant de vous lancer dans la programmation et de développer vos propres applications.