Utiliser oBasic dans le Tableur (Calc)

Image non disponible Image non disponible

Ce tutoriel ne sera qu'un élément de base pour la programmation, il ne contiendra pas toutes les commandes possibles, mais l'essentiel pour commencer à travailler avec le Tableur (Calc).

Je ne vais pas chercher à faire au cours de ce tutoriel un comparatif entre oBasic et VBA.

Vous pouvez commenter l'article en suivant le lien suivant : 10 commentaires Donner une note à l'article (5), alors après votre lecture, n'hésitez pas.

Article lu   fois.

L'auteur

Profil ProSite personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

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 :

Image non disponible

Sous Ubuntu :

Image non disponible

Sous OpenSuse :

Image non disponible

Sous Debian :

Image non disponible

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… » :

Image non disponible

La fenêtre suivante apparaît :

Image non disponible

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 :

Image non disponible

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 :

Image non disponible

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 :

Image non disponible
  • (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 :

Image non disponible

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 :

 
Sélectionnez
Sub Exemple_1

    Dim Txt as String
    
    Txt = "Hello World !"
    
    MsgBox Txt

End Sub

Nous obtiendrons donc :

Image non disponible

Exemple 2, nous affichons un message que nous aurons saisi :

 
Sélectionnez
Sub Exemple_2

    Dim Txt as String
    
    Txt = InputBox ("Titre")
    
    MsgBox Txt

End Sub

La fenêtre suivante apparaît :

Image non disponible

Nous saisissons le texte souhaité :

Image non disponible

Nous obtenons donc :

Image non disponible

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 :

 
Sélectionnez
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

 
Sélectionnez
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

 
Sélectionnez
Sub FeuilleActive()

    ...
    
    Msgbox ThisComponent.CurrentController.ActiveSheet.Name

    ...

End Sub

IV-B-3. Renommer une feuille

 
Sélectionnez
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

 
Sélectionnez
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 :

 
Sélectionnez
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

 
Sélectionnez
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

 
Sélectionnez
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

 
Sélectionnez
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

 
Sélectionnez
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

 
Sélectionnez
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

 
Sélectionnez
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

 
Sélectionnez
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

 
Sélectionnez
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

 
Sélectionnez
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

 
Sélectionnez
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

 
Sélectionnez
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

 
Sélectionnez
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 :

 
Sélectionnez
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.

VII. Remerciements

Je remercie chrtophe pour ses remarques et ses conseils, et ced et phanloga pour leurs corrections orthographique et syntaxique.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Licence Creative Commons
Le contenu de cet article est rédigé par Vincent Viale et est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Pas de Modification 3.0 non transposé.
Les logos Developpez.com, en-tête, pied de page, css, et look & feel de l'article sont Copyright © 2013 Developpez.com.