Suite à pas mal de recherches pour arriver à un résultat convenable, je vous joins un classeur permettant de créer uniquement par macro un diagramme de type "Ligne" car je trouve qu'on manque d'info pour ce genre de tâches.
Dans le fichier joint, vous trouverez sur la droite le diagramme que je veux obtenir par macro. À condition d'avoir installé l'extension XRay, il est possible d'obtenir les propriétés de ce graphique pour les utiliser dans la macro. Sur la gauche, on voit le graphique entièrement généré par la macro.
Sources utiles :
- Source principale d'après le code proposé par hanya : https://forum.openoffice.org/en/forum/v ... 991#p46467
- viewtopic.php?t=60265
- https://wiki.documentfoundation.org/Doc ... ide/Charts
- https://openoffice-libreoffice.developp ... graphiques
On voit aussi comment mettre en forme le diagramme.
Voici la macro :
Code : Tout sélectionner
Sub CreerGraphiqueLigne
' Macro attachée au bouton "Créer Graphique"
' Macro qui permet de créer un graphique de type ligne
Dim monClasseur As Object, lesFeuilles As Object, graphiques As Object
Dim rect As new com.sun.star.awt.Rectangle
Dim source(1) As New com.sun.star.table.CellRangeAddress
monClasseur = ThisComponent
lesFeuilles = monClasseur.Sheets
'place le graphique dans la feuille
rect.X = 500 ' position x sur la feuille
rect.Y = 6500 ' position y sur la feuille
rect.Width = 16000 ' largeur du diagramme en 1/100 mm soit 16 cm ici
rect.Height = 8000 ' hauteur du diagramme en 1/100 mm soit 8 cm ici
graphiques=lesFeuilles(0).Charts
source(0)=lesFeuilles(0).GetCellRangeByName("A3:K7").RangeAddress 'Plage contenant les données utiles au graphique
graphiques.addNewByName("GraphiqueMacro", rect ,source(), false, false)
newGraphique=graphiques.getByName("GraphiqueMacro").EmbeddedObject
' AJOUT DES SÉRIES
oDataProvider = newGraphique.getDataProvider()
oDiagram = newGraphique.getFirstDiagram()
oCooSys = oDiagram.getCoordinateSystems()
oCoods = oCooSys(0)
oChartTypes = oCoods.getChartTypes()
oChartType = oChartTypes(0)
' Toutes les séries de données du nouveau graphique
oDataSeriesList = oChartType.getDataSeries()
' création des séries
Dim oNewDataSeriesList(3) As Object ' sert à préparer la création de 4 nouvelles séries
oSeries1 = CreateDataSeries_LineDiagram(oDataProvider, "Feuille1.B4:K4", "Feuille1.A4")
oSeries2 = CreateDataSeries_LineDiagram(oDataProvider, "Feuille1.B5:K5", "Feuille1.A5")
oSeries3 = CreateDataSeries_LineDiagram(oDataProvider, "Feuille1.B6:K6", "Feuille1.A6")
oSeries4 = CreateDataSeries_LineDiagram(oDataProvider, "Feuille1.B7:K7", "Feuille1.A7")
' Fixe la couleur des lignes (séries)
cRouge=RGB(255,0,0) 'Couleur ROUGE long=16711680 Hexadécimal = 00FF0000
cJaune=RGB (255,255,0) 'Couleur JAUNE long=16776960 Hexadécimal = 00FFFF00
cVert=RGB(0,169,51) 'Couleur VERT=43315 Hexadécimal = 0000A933
cBleu=RGB (42,96,143) 'Couleur BLEU long=2777231 Hexadécimal = 002A608F
oSeries1.Color = cRouge
oSeries2.Color = cJaune
oSeries3.Color = cVert
oSeries4.Color = cBleu
' mise à jour du nouveau graphique en y intégrant les séries
oNewDataSeriesList(0) = oSeries1
oNewDataSeriesList(1) = oSeries2
oNewDataSeriesList(2) = oSeries3
oNewDataSeriesList(3) = oSeries4
'xray oNewDataSeriesList
oChartType.setDataSeries(oNewDataSeriesList)
' Création des étiquettes sur l'axe X
xAxis = oCoods.getAxisByDimension(0,0)
oScaledata = xAxis.ScaleData
'oCat = oScaledata.Categories 'Utile pour récupérer les données en cas de mise à jour (ce n'est pas le cas ici pour une nouvelle création)
'oPlageX = lesFeuilles(0).getCellRangeByName("B3:K3").RangeAddress 'Utile si l'on devait par exemple récupérer la plage pour une mise à jour
sPlageX = lesFeuilles(0).getCellRangeByName("B3:K3").AbsoluteName 'Plage pour les données en X
newValues = oDataProvider.createDataSequenceByRangeRepresentation(sPlageX)
newValues.Role = "categories"
newValues.SourceRangeRepresentation("Feuille1.B3:K3")
newValues.IncludeHiddenCells = "True"
newCat = CreateUnoService("com.sun.star.chart2.data.LabeledDataSequence")
newCat.Values = newValues
oScaledata.Categories = newCat
xAxis.setScaleData(oScaledata)
'Mise en forme finale (NE PAS LE FAIRE AVANT avant d'avoir peupler les dataseries !!!)
xray newGraphique.Legend
With newGraphique
.Diagram = newGraphique.createInstance("com.sun.star.chart.LineDiagram") 'Type de graphique : ici Line Diagram
.Diagram.Wall.Fillcolor=-1 'Couleur de fond du graphique (ici pas de couleur) Couleur grise par défaut
.Diagram.Wall.LineColor = 11776947 'Couleur de la bordure du graphique
.Diagram.Wall.LineStyle=1 'Type de trait de la bordure : ici "continue"
.Diagram.SplineType = 0
.Diagram.HasXAxisTitle = False
'.Diagram.XAxisTiTle.string = "Journées"
.Diagram.HasYAxisTitle = False
'.Diagram.XAxisTiTle.CharHeight = 16
.Diagram.XAxis.CharHeight = 8
.Diagram.SymbolType =-2 ' permet d'avoir des symboles différents selon les séries, mettre -3 si on ne veut pas de symboles
'.Diagram.SymbolType =com.sun.star.chart.ChartSymbolType.SYMBOL1 'Impose le symbole "carré"
.HasMainTitle = True
.Title.string = "Graphique des taux à la journée"
.Title.CharHeight = 13
.Area.LineWidth=80 'fixe la largeur des lignes en 1/100e mm
.HasLegend=True 'Permet d'afficher la légende
.Legend.FillColor=-1 'Couleur de fond de la légende (ici pas de couleur) Couleur grise par défaut
.Legend.LineStyle=0 'Type de trait de la bordure de la légende : ici "aucun"
End With
End Sub
En espérant que ça serve

A lèu,
Thierry