Macros

From The Document Foundation Wiki
< Macros‎ | Calc
Jump to: navigation, search

Comment accéder à un diagramme par son nom utilisateur ?

Lorsqu'on crée un graphique dans l'interface du tableur, le logiciel attribue à cet objet un nom interne (en général Object1, Object2, etc.) qu'on retrouve dans le navigateur (menu Affichage ▸ Navigateur ou F5).

Le menu contextuel (clic droit sur le diagramme puis Nom) permet d'attribuer un nom plus "ergonomique", correspondant davantage au contenu. Le nom donné remplace alors le nom interne dans le navigateur.

En revanche, accéder à un diagramme par programme via ce nom utilisateur n'est pas possible directement car la méthode getByName de la collection concernée (Charts) utilise uniquement le nom interne.

La solution est de passer par une étape intermédiaire. En quelque sorte, nommer le diagramme se fait dans la couche "dessin" de la feuille. On commence donc par rechercher dans cette "couche" l'objet portant le nom utilisateur (par opposition au nom "interne" donné par LibreOffice lors de la création du diagramme). Une fois qu'on a l'objet, on obtient le nom interne correspondant par lequel on peut, via la collection Charts, modifier le graphique.

Ci-dessous un exemple mettant en oeuvre cela pour modifier le titre et la plage de données du graphique nommé "barres" dans le classeur joint.


option explicit

sub LibOModifierGrapheBoucle
dim LibOClasseur as Object, LibOFeuille as Object, LibOGraph as Object, LibOPlage as Object, LibOshape as object
dim LibOData(0) as new com.sun.star.table.CellRangeAddress
dim LibONbShape as integer

LibOClasseur = thisComponent
LibOFeuille = LibOClasseur.sheets.getByName("Feuille1")

for LibONbShape = 0 to LibOFeuille.DrawPage.count - 1
        LibOshape = LibOFeuille.DrawPage.getByIndex(LibONbShape) 
        if LibOshape.name = "barres" then
                ' Plage qu'on veut utiliser comme source pour le graphique      
                LibOPlage = LibOFeuille.getCellRangeByName("$Feuille1.$A$1:$E$4")
                LibOData(0) = LibOPlage.RangeAddress

                LibOGraph = LibOFeuille.Charts.getByName(LibOshape.persistName)
                LibOGraph.embeddedObject.Title.String = "Graphe du " & now
                LibOGraph.setranges(LibOData())
                exit for
        end if    
next LibONbShape 

end sub
  • La propriété persistName renvoie le nom interne.