Nous allons au travers de cet article réaliser quelques exemples de façon à mieux comprendre le fonctionnement du Basic dans Libre Office Macro.
Résumé : Libre Office Macro Basic est un langage de programmation fourni avec Libre Office. Il permet de réaliser des portions de codes informatique nous permettant de nous simplifier la vie et interagir avec la suite bureautique Libre Office. Dans cet article nous allons créer des morceaux de codes de façon à nous familiariser avec le langage Basic et l’api de Libre Office.
Ainsi à l’aide des macros nous allons créer une facture au format odt Ce code a été testé avec Libre Office Version : 4.2.8.2 sous Ubuntu 14.04.
Les outils
Afin de mettre en place ce how-to, il nous faut les ingrédients suivants :
$ sudo apt-get install libreoffice
Préparation
Il faut tout d’abord ouvrir un document de la suite Libre Office (dans cet exemple, le document utilisé sera un document Calc vide intitulé docPrincipal.ods).
Afin d’accéder au macro dans Libre Office, il faut utiliser le chemin suivant : Outils - Macros - Gérer les macros - LibreOffice Basic …
Puis afin de créer la macro dans le fichier ods docPrincipal.ods, il faut utiliser la démarche suivante : Clic sur docPrincipal.ods, Clic sur Standard et enfin Clic sur le bouton Nouveau.
A ce moment une boite de dialogue demande un nom pour le module de macro Basic, nous allons l’appeler monModuleLinuxMag et faire un clic sur OK.
L’environnement LibreOffice Basic s’ouvre alors :
La première ligne que nous apercevons dans la fenêtre de droite (REM * BASIC *) est une ligne de commentaire. Nous pouvons également écrire des commentaires en Basic en utilisant la simple quote. REM (sur une ligne entière) et la simple quote : ’ ceci est une remarque
Pour se lancer une macro doit avoir ses les lignes de codes situées entre Sub leNomDeLamethode et End Sub.
Par défaut LibreOffice Basic créé la méthode Sub Main et End Sub
Afin de faciliter le repérage dans les lignes du code, nous allons également faire apparaître les numéros de ligne en utilisant la manipulation suivante : Clic dans le menu Affichage puis sélection Numéros de ligne.
Phase 1 : création de notre première macro : le fameux « Bonjour le monde » Il est de tradition lorsque nous rencontrons un nouveau langage en programmation d’utiliser un message affichant « Bonjour le monde » (Hello Word ! Pour les anglophones), c’est ce que nous allons faire avec Libre Office Basic. Pour ce faire nous allons remplacer tout le code contenu dans la fenêtre de droite et le remplacer par celui-ci :
REM ***** MON PREMIER PROGRAMME EN BASIC ***** Sub premierProgramme ’Indique le début du programme msgbox "Bonjour le monde !" ’Affiche une boite de dialogue à l’écran bonjour le monde ! End Sub ’Indique la fin du programme
Pour éxécuter notre code, il ne nous reste plus qu’à le lancer en appuyant sur Exécuter le Basic
ou en cliquant sur exécuter une macro, puis en sélectionnant la macro voulue (ici premierProgramme) puis Clic sur Exécuter. Vous deviez alors avoir cette petite boite de dialogue qui s’affiche à l’écran :
Phase 2 : Accéder à une cellule Calc et afficher son contenu. Pour interagir avec les éléments d’un document Libre Office, nous allons devoir manipuler les objets contenus sous Libre Office à la manière d’un arbre d’objets voir le schéma ci-dessous :
Ainsi pour accéder à une cellule d’une feuille de calcul de Calc (je pars de l’hypothèse que Calc est déjà lancé, la procédure étant légèrement différente s’il faut en plus ouvrir le document, j’en reparlerai par la suite), nous avons besoin : d’accéder au document en cours (ThisComponent) d’accéder au niveau du document en cours à la feuille appelée Feuille1 (sheets.getByName(“Feuille1”)) d’accéder au niveau de la feuille1 à la cellule appelée C2 (feuille.getCellRangeByName(“C2”))
Pour notre exemple, nous allons afficher un message Bonjour suivi du prénom de la personne saisi dans la cellule C2.
Voici le code ci-dessous correspondant : REM * AFFICHE LE CONTENU D’UNE CELLULE * Sub afficheContenuCellule ’Indique le début du programme REM * déclaration des variables à utiliser * dim monDoc as object ’déclaration d’une variable monDoc as object dim feuille as object ’déclaration d’une variable feuille as object dim cellule as Object ’déclaration d’une variable cellule as object monDoc = ThisComponent ’Sélectionne le document en cours feuille=Mondoc.sheets.getByName(“Feuille1”) ’Sélectionne la feuille nommée Feuille1 cellule=feuille.getCellRangeByName(“C2”) ’Sélectionne la cellule nommée C2 msgbox “Bonjour ” + cellule.string ’Affiche à l’écran bonjour suivi du prénom situé en C2 End Sub ’Indique la fin du programme En cliquant sur exécuter une macro, puis en sélectionnant la macro voulue (ici afficheContenuCellule) puis Clic sur Exécuter, vous devriez avoir une boite de dialogue qui affiche Bonjour suivi du contenu de la cellule. Quelques petites remarque sur le code ci-dessus : Afin de déclarer une variable en Basic, nous utilisons dim nomDeLaVariable as TypeDeLaVariable ici par exemple dim feuille as object nous déclarons une variable à l’intérieur de notre procédure qui s’appelle feuille et qui est de type object. Pour afficher une chaîne de caractère ou une date contenue dans la cellule, nous utilisons le nomDeLaCellule.string ici cellule.string, si nous voulons afficher une valeur numérique (ou manipuler un format de type date), nous utilisons cellule.value et enfin si nous souhaitons afficher une formule contenue dans la cellule, nous utilisons cellule.formula pour la formule au format anglais ou cellule.formulaLocal pour la formule au format local, dans notre cas de figure en français. Phase 3 : Ouvrir un fichier existant et afficher le contenu d’une cellule dans ce fichier. Jusqu’à présent, nous avons manipuler les macros avec le document Calc en cours, maintenant, nous allons ouvrir un autre fichier Calc à partir du document Calc en cours d’exécution, pour cela nous avons besoin : de l’adresse du document que nous avons besoin d’ouvrir à convertir dans un format d’adresse valide convertToURL(“\leCheminDuFichier\leFichier.ods”) du composant et de la méthode permettant d’ouvrir un fichier StarDesktop.loadComponentFromURL(…) Pour notre exemple, nous allons afficher la cellule D3 du fichier “Martineau Aurélien.ods” dont voici un extrait ci_dessous :
Voici le code ci-dessous correspondant : Sub afficherValFichExist() dim monDoc,feuille,cellule as object ’indique les variables de type object dim adresseContratSousLinux,adresseContratSousWindows,nomCellule as string ’variables de type chaîne ’adresse pour un ordinateur sous Linux Ubuntu adresseContratSousLinux = convertToURL(“/home/am/contrats/coursIDRAC/MARTINEAU Aurélien.ods”) ’adresse pour un ordinateur sous Windows 8 adresseContratSousWindows = convertToURL(“C :\Users\am\contrats\coursIDRAC\MARTINEAU Aurélien.ods”) ’Ouvre le document dont l’adresse est indiquée en paramètre et le stocke dans la variable monDoc monDoc = StarDesktop.loadComponentFromURL(adresseContratSousLinux, “_blank”, 0, Array() ) feuille=monDoc.sheets(“cours”) ’sélectionne la feuille ou se situe les cours nomCellule=“D” & “3” ’indique le nom de la cellule nommée D3 dans la variable nomCellule cellule=feuille.getCellRangeByName(nomCellule) ’Sélectionne la cellule passée en paramètre msgbox “La valeur de la cellule : ” + cellule.string ’Affiche à l’écran la valeur de la cellule D3 End Sub En cliquant sur exécuter une macro, puis en sélectionnant la macro voulue (ici afficherValFichExist) puis Clic sur Exécuter, vous devriez avoir une boite de dialogue qui affiche « La valeur de la cellule : BTS MUC/NRC 1 ALT - 15/16 ». Quelques petites remarque sur le code ci-dessus : Pour déclarer plusieurs variables d’un même type, il suffit de séparer ces variables par des virgules (exemple ici les 3 variables monDoc,feuille,cellule sont déclarées de type object. Pour utiliser l’adresse sous Windows 8 plutôt que celle sous linux remplacer la variable adresseContratSousLinux par adresseContratSousWindows au niveau de la fonction StarDesktop.loadComponentFromURL. Les différents éléments en paramètres de cette fonction sont : l’adresse du fichier (ici adresseContratSousLinux), le nom de la fenêtre dans laquelle va s’ouvrir le document (“_blank” si on ne réutilise pas le nom de la fenêtre), le numéro du drapeau (0 si on réutilise une fenêtre existante), les différentes options passées en paramètre (ici un tableau vierge), mais par exemple pour ouvrir ce même fichier sans qu’il soit visible nous aurions eu le code ci-dessous éléments changeant en vert : Sub afficherValFichExist() dim monDoc,feuille,cellule as object ’indique les variables de type object dim adresseContratSousLinux,adresseContratSousWindows,nomCellule as string ’variables de type chaîne ’déclare un tableau dont la 1ère valeur à la syntaxe de la structure com.sun.star.beans.PropertyValue dim tabProp(0) as New com.sun.star.beans.PropertyValue ’adresse pour un ordinateur sous Linux Ubuntu adresseContratSousLinux = convertToURL(“/home/am/contrats/coursIDRAC/MARTINEAU Aurélien.ods”) ’adresse pour un ordinateur sous Windows 8 adresseContratSousWindows = convertToURL(“C :\Users\am\contrats\coursIDRAC\MARTINEAU Aurélien.ods”) ’j’indique le nom de l’option que je modifie ici la propriété de caché qui s’appelle hidden tabProp(0).Name=“Hidden” ’attention la majuscule à Hidden est un impératif tabProp(0).Value=true ’j’indique la valeur de l’option caché à vrai ’Ouvre le document dont l’adresse est indiquée en paramètre et le stocke dans la variable monDoc monDoc = StarDesktop.loadComponentFromURL(adresseContratSousLinux, “_blank”, 0, tabProp() ) feuille=monDoc.sheets(“cours”) ’sélectionne la feuille ou se situe les cours nomCellule=“D” & “3” ’indique le nom de la cellule nommée D3 dans la variable nomCellule cellule=feuille.getCellRangeByName(nomCellule) ’Sélectionne la cellule passée en paramètre msgbox “La valeur de la cellule : ” + cellule.string ’Affiche à l’écran la valeur de la cellule D3 monDoc.close(true)’je ferme le document non visible car je ne peux donc pas cliquer pour le fermer End Sub Phase 4 : Parcourir un fichier existant et en fonction de certaines conditions faire tel ou tel chose. A partir du document que nous avons ouvert précédemment, nous allons recherché les cours enseignés par rapport au mois en cours. Pour cela nous allons parcourir les lignes du fichier une à une à l’aide du boucle for dont la syntaxe générale est la suivante : FOR nomVar=valeurDebut TO valeurFin ’indication du début de la boucle ’faire les traitements désirés durant la boucle NEXT ’indication de la fin de la boucle Puis dans le traitement de la boucle nous allons affichés seulement les lignes de cours dont le mois correspond au mois en cours. Pour effectuer une condition en Basic nous utilisons la syntaxe suivante : IF condition THEN ’indication du début de la condition à vérifier ’traitement à réaliser si la condition est vraie ELSE ’traitement à réaliser si la condition est fausse, le sinon(else) n’est pas obligatoire END IF ’indication de la fin de la condition à vérifier Ensuite nous afficherons une boite de dialogue à l’écran récapitulant les éléments de chacun des cours pour le mois en cours puis le nombre d’heure de chacun de ces cours, puis le prix de chacun de ces cours et enfin le prix total des cours du mois. Voici le code ci-dessous correspondant :
Sub lireLesElements dim monDoc as object dim adresseContrat,nomFormation,nomMatiere,cel,intituleCours,dateFormation,debFormation,finFormation as string dim i,j,nbreLignes,nbreCol as integer dim prixHeureCours,prixDuCours,nbreHeure,prixTotal as double dim tabProp(0) as New com.sun.star.beans.PropertyValue nbreLignes=62 ’j’indique qu’il y a 62 lignes à vérifier adresseContrat = convertToURL(“/home/am/contrats/coursIDRAC/MARTINEAU Aurélien.ods”) tabProp(0).Name=“Hidden” ’attention la majuscule à Hidden est un impératif tabProp(0).Value=true ’j’indique la valeur de l’option caché à vrai monDoc = StarDesktop.loadComponentFromURL(adresseContrat, “_blank”, 0, tabProp()) prixTotal=0 ’j’initialise le prix total des cours à 0 For i=2 to nbreLignes ’je parcours chacune des lignes avec la boucle for ’je verifie sil’année en cours et le mois en cours possède une formation if(year(monDoc.Sheets(0).getCellByPosition(6,i).String)=year(now()) and (month(monDoc.Sheets(0).getCellByPosition(6,i).String)=month(now())) ) then intituleCours=“Réalisation du ou des Cours suivants :” & Chr$(13) & “- Nom de l’enseignant : Aurélien MARTINEAU” ’’j’initialise l’intitulé du cours ’J’INDIQUE LE NOM DE LA MATIERE cel=“B” & i+1 ’Attention dans getCellByPosition nous commençons à 0 pour la ligne 1 ’j’indique le nom de la matière dans la variable nomMatiere nomMatiere=monDoc.Sheets(0).getCellRangeByName(cel).String ’j’ajoute le nom de la matière (avec un saut à la ligne avant(chr(13)) à l’intitulé intituleCours=intituleCours & Chr$(13) & “-Nom de la matière : ” & nomMatiere cel=“D” & i+1 ’j’indique la cellule de la formation ’j’indique le nom de la formation dans la variable nomFormation nomFormation=monDoc.Sheets(0).getCellRangeByName(cel).String intituleCours=intituleCours & Chr$(13) & “-Classe concernée : ” & nomFormation ’J’INDIQUE LA DATE DE LA FORMATION cel=“G” & i+1 ’j’indique la cellule de la date formation dateFormation=monDoc.Sheets(0).getCellRangeByName(cel).String ’j’indique la date intituleCours=intituleCours & Chr$(13) & “-Date d’intervention : ” & dateFormation ’J’INDIQUE L’HEURE DE DEBUT DE LA FORMATION cel=“J” & i+1 ’j’indique la cellule du début formation debFormation=monDoc.Sheets(0).getCellRangeByName(cel).String ’j’indique le début ’J’INDIQUE L’HEURE DE FIN DE LA FORMATION cel=“K” & i+1 ’j’indique la cellule de la fin de formation finFormation=monDoc.Sheets(0).getCellRangeByName(cel).String ’j’indique la fin intituleCours=intituleCours & Chr$(13) & “-Heures d’intervention : ” & debFormation &“ - ” &finFormation ’ si le cours est un oral le prix du cours est à divisé par 2 cel=“I” & i+1 ’j’indique le type de cellule de l’action de formation (oral ou non) ’je verifie si la cellule de la ligne i est un oral if monDoc.Sheets(0).getCellRangeByName(cel).String=“ORAL” then prixHeureCours=35 ’si oral J’indique le prix de l’heure de cours est de 35€ else ’sinon prixHeureCours=70 ’sinon j’indique le prix de l’heure de cours est de 70€ end if cel=“L” & i+1 ’j’indique le type de cellule du nombre d’heures de formation nbreHeure=monDoc.Sheets(0).getCellRangeByName(cel).value prixDuCours=prixHeureCours*nbreHeure ’je calcule le prix du cours ’j’ajoute le prix du cours au prix total (contenant les autres cours du mois) prixTotal=prixTotal+prixDuCours msgbox intituleCours ’j’affiche les élements concernants le cours enseigné msgbox “Nombre d’heures : ” & nbreHeure ’j’affiche le nombre d’heures de cours msgbox “Prix du cours : ” & prixDuCours & “ €” ’j’affiche le prix du cours end if next msgbox “Prix total des cours du mois : ” & prixTotal & “ €” ’j’affiche le prix total des cours monDoc.close(true) ’je ferme le document end sub Phase 5 : Écrire dans une cellule d’un fichier Calc. Afin d’écrire dans une cellule d’un fichier calc, si c’est une chaîne de caractère dans la cellule, nous utilisons le nomDeLaCellule.string=“La valeur à écrire”. Si nous voulons écrire une valeur numérique, nous utilisons nomDeLaCellule.value=valeurNumérique et enfin si nous souhaitons écrire une date ou une formule dans la cellule, nous utilisons cellule.formula pour la formule au format anglais ou cellule.formulaLocal pour la formule au format local, dans notre cas de figure en français. Voici un exemple correspondant ci-dessous : Voici le code ci-dessous correspondant : REM * ECRIRE DANS DIFFERENTES CELLULES * Sub ecrireDansPlusieursCellules dim monDoc,feuille,cellule as Object ’déclaration des variables de type object monDoc = ThisComponent ’Sélectionne le document en cours feuille=Mondoc.sheets.getByName(“Feuille1”) ’Sélectionne la feuille nommée Feuille1 cellule=feuille.getCellRangeByName(“A1”) ’Sélectionne la cellule nommée A1 cellule.string=“Aurélien Martineau” ’écrit Aurélien MARTINEAU en A1 cellule=feuille.getCellRangeByName(“A2”) ’Sélectionne la cellule nommée A2 cellule.value=5 ’écrit la valeur 5 en A2 cellule=feuille.getCellRangeByName(“A3”) ’Sélectionne la cellule nommée A3 cellule.value=12.5 ’remarque la saisie des nombres se fait avec un point comme en anglais cellule=feuille.getCellRangeByName(“A4”) ’Sélectionne la cellule nommée A4 cellule.formulaLocal=“=somme(A2:A3)” ’indique le résultat du calcul de la somme en A4 cellule=feuille.getCellRangeByName(“A5”) ’Sélectionne la cellule nommée A5 cellule.formulaLocal=“12/05/2016” ’écrit la date 12/05/2016 en A5 End Sub Phase 6 : Écrire dans un fichier Writer pour créer notre facture. Jusqu’à présent, nous avons manipuler les macros avec Calc, nous allons maintenant utiliser un modèle de document Writer afin d’effectuer notre facture ainsi que les manipulations que nous avons déjà effectuée dans la phase précédente. Pour cela nous avons nous avons besoin : - du modèle de document Writer que nous avons besoin d’ouvrir /home/am/factures/modele-Facture.ott - du document Calc Aurélien Martineau.ods que nous avons utilisé précédemment - de faire des rechercher/ remplacer avec le texte contenu dans Writer avec l’élément nomDuDocumentWriter.createReplaceDescriptor - d’ajouter des lignes à un tableau existant dans Writer avec l’élément nomDuTableau.Rows.insertByIndex(1,1) - de modifier les éléments des lignes du tableau créé avec l’élément nomDuTableau.getCellByPosition(numeroCol,numeroLigne).String=“valeur souhaitée”
Voici le code ci-dessous correspondant :
Sub lireLesElementsEtlesRemplirDansWriter REM DECLARATION DES VARIABLES DONT NOUS AVONS BESOIN Dim monDocW, monTableauPresta, monTableuTotal,monTexteaRemplacer As Object Dim FileProperties(0) As New com.sun.star.beans.PropertyValue Dim adresseMod, adresseDoc As String dim monDoc as object dim adresseContrat,nomFormation,nomMatiere,cel,intituleCours,dateFormation,datePremForm, dateDerForm,debFormation,finFormation as string dim i,j,nbreLignes,nbreCol,numeroLigneCours as integer dim prixHeureCours,prixDuCours,nbreHeure,prixTotal as double dim tabProp(0) as New com.sun.star.beans.PropertyValue dim dateDuJour as Date ’J’ouvre le fichier modèle préparé sous Writer adresseMod = convertToURL(“/home/amartineau/monEtps/TerCompta/Factures/modele-Facture.ott”) monDocW = StarDesktop.loadComponentFromURL(adresseMod, “_blank”, 0, Array() ) ’je crée l’élément qui permet de remplacer une partie du texte dans Writer monTexteaRemplacer=monDocW.createReplaceDescriptor monTexteaRemplacer.searchString=“dateFact” ’j’indique le texte à rechercher pour le remplacement monTexteaRemplacer.replaceString=DATE()’j’indique le texte à utiliser pour le remplacement monDocW.replaceAll(monTexteaRemplacer)’je lance la fonction pour remplacer le texte monTexteaRemplacer.searchString=“datePena”’j’indique le texte à rechercher pour le remplacement monTexteaRemplacer.replaceString=DATE()+30’j’indique le texte à utiliser pour le remplacement monDocW.replaceAll(monTexteaRemplacer)’je lance la fonction pour remplacer le texte REM PROG DE LECTURE DES ELEMENTS nbreLignes=62 ’j’indique qu’il y a 62 lignes à vérifier adresseContrat = convertToURL(“/home/amartineau/cours/coursIDRAC/MARTINEAU Aurélien.ods”) tabProp(0).Name=“Hidden” ’attention la majuscule à Hidden est un impératif tabProp(0).Value=true ’j’indique la valeur de l’option caché à vrai monDoc = StarDesktop.loadComponentFromURL(adresseContrat, “_blank”, 0, tabProp()) prixTotal=0 numeroLigneCours=0 ’j’initialise le numéro de ligne à 0 ’je defini le tableau sur lequel je vais travailler dans Writer monTableauPresta=monDocW.TextTables.getByName(“tabPrestation”) For i=2 to nbreLignes ’Boucle pour parcourir les différentes lignes du fichier « Aurelien Martineau » ’je verifie si le mois en cours possède une formation if(year(monDoc.Sheets(0).getCellByPosition(6,i).String)=year(now()) and (month(monDoc.Sheets(0).getCellByPosition(6,i).String)=month(now())) ) then numeroLigneCours=numeroLigneCours+1 ’on ajoute une nouvelle ligne intituleCours=“Réalisation du ou des Cours suivants :” & Chr$(13) & “- Nom de l ’enseignant : Aurélien MARTINEAU” ’J’INDIQUE LE NOM DE LA MATIERE cel=“B” & i+1 ’j’indique la cellule de la matière nomMatiere=monDoc.Sheets(0).getCellRangeByName(cel).String ’j’indique la matière intituleCours=intituleCours & Chr$(13) & “-Nom de la matière : ” & nomMatiere cel=“D” & i+1 ’j’indique la cellule de la formation nomFormation=monDoc.Sheets(0).getCellRangeByName(cel).String ’j’indique la formation intituleCours=intituleCours & Chr$(13) & “-Classe concernée : ” & nomFormation cel=“G” & i+1 ’j’indique la cellule de la date formation dateFormation=monDoc.Sheets(0).getCellRangeByName(cel).String ’j’indique la date if numeroLigneCours = 1 Then ’si je suis sur la première ligne du mois de formation datePremForm=dateFormation ’indique la date de première formation end if dateDerForm=dateFormation ’écrase la date de dernière formation par la date actuelle intituleCours=intituleCours & Chr$(13) & “-Date d’intervention : ” & dateFormation cel=“J” & i+1 ’j’indique la cellule du début formation debFormation=monDoc.Sheets(0).getCellRangeByName(cel).String ’j’indique le debut cel=“K” & i+1 ’j’indique la cellule de la fin de formation finFormation=monDoc.Sheets(0).getCellRangeByName(cel).String ’j’indique la fin intituleCours=intituleCours & Chr$(13) & “-Heures d’intervention : ” & debFormation &“ - ” &finFormation cel=“I” & i+1 ’j’indique le type de cellule de l’action de formation if monDoc.Sheets(0).getCellRangeByName(cel).String=“ORAL” then ’ oral prixHeureCours=35 ’si oral J’indique le prix de l’heure de cours est de 35€ else prixHeureCours=70 ’sinon j’indique le prix de l’heure de cours est de 70€ end if cel=“L” & i+1 ’j’indique le type de cellule du nombre d’heures de formation nbreHeure=monDoc.Sheets(0).getCellRangeByName(cel).value prixDuCours=prixHeureCours*nbreHeure ’je calcule le prix du cours prixTotal=prixTotal+prixDuCours ’j’ajoute le prix du cours au prix total monTableauPresta.Rows.insertByIndex(1,1)’j’insere une ligne à mon tableau ’Mise à jour des cellules de la ligne que l’on vient d’ajouter au tableau monTableauPresta.getCellByPosition(0,numeroLigneCours).String=intituleCours monTableauPresta.getCellByPosition(1,numeroLigneCours).String=prixHeureCours monTableauPresta.getCellByPosition(2,numeroLigneCours).String=nbreHeure monTableauPresta.getCellByPosition(3,numeroLigneCours).String=prixDuCours
monTexteaRemplacer.searchString=“dateDeb” ’j’indique le texte à rechercher monTexteaRemplacer.replaceString=datePremForm ’j’indique le texte de remplacement monDocW.replaceAll(monTexteaRemplacer) ’je lance le remplacement monTexteaRemplacer.searchString=“dateFin”’j’indique le texte à rechercher monTexteaRemplacer.replaceString=dateDerForm monDocW.replaceAll(monTexteaRemplacer) end if next ’je passe à la ligne suivante monDoc.close(true) ’je ferme le document calc J’indique le nom du tableau total et je l’affecte à la variable monTableuTotal monTableuTotal=monDocW.TextTables.getByName(“tabTotal”) monTableuTotal.getCellByPosition(1,0).String=prixTotal & “ €” ’mise à jour de la cellule du tableau adresseDoc=convertToURL(“/home/am/Factures/Facture-201689999.odt”) ’adresse de la facture FileProperties(0).Name = “Overwrite” ’j’indique l’option d’ecraser si le fichier existe FileProperties(0).Value = True ’je definis la valeur à vrai monDocW.storeAsURL(adresseDoc, FileProperties()) ’j’enregistre le document monDocW.close(True) ’je ferme le document end sub Conclusion Au travers de cet article nous avons vu comment manipuler des macros sous Libre Office Calc et créer une facture dans Writer à l’aide de ces mêmes macros.