Macros

    From The Document Foundation Wiki
    < Macros‎ | Calc


    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.