Writer : changer plage de graphique par macro

et j’ai, semble-t-il, trouvé la solution en adaptant simplement ce que vous aviez fait.

je pofine, un peu plus tard, et enverrai la solution !

merci encore
Philippe

Pourquoi passer ton temps à utiiser d’autres instructions que celles déjà données :face_with_diagonal_mouth: ?

En l’occurrence

newseqLabel = CreateUnoService("com.sun.star.chart2.data.LabeledDataSequence")

qui est l’appel correct…

L’objet que tu créées supporte le même service com.sun.star.chart2.data.LabeledDataSequence avec les mêmes interfaces, propriétés et méthodes.

parce que … ce n’est pas la même chose il me semble.

ce qui se passe :
si le graphique a, disons, 4 séquences configurées (= 4 “colonnes”) la table oDiag.dataSequences va avoir 4 élements.
si je veux maintenant montrer 5 séquences. je vais devoir créer un nouvel élément dans la table et c’est fait avec

redim preserve oDataSequences(4)
oDataSequences(4) = CreateUnoService( “com.sun.star.comp.chart2.LabeledDataSequence”)

ensuite pour le remplissage (label et données) on utilise en effet >com.sun.star.chart2.data.LabeledDataSequence

n’est-ce pas ainsi ? (mais il y a peut-être des synonymes!)

en tous cas cela a l’air de fonctionner ! :slight_smile:

Si

Oui

par exemple (je ne mets que le début) :

	oDiag = oSel.embeddedObject.component
	oDataProvider = oDiag.getDataProvider()
	oDatasequences = oDiag.DataSequences

redim preserve oDatasequences(4)

	oSeq = oDatasequences(0)
	oValues = oSeq.Values
	newrepr = sValeurs
	newvalues = oDataProvider.createDataSequenceByRangeRepresentation("Tableau2.A2:A5")
	newvalues.Role = oValues.Role
	newseqValues = CreateUnoService("com.sun.star.chart2.data.LabeledDataSequence")
	newseqValues.Values = newvalues

	oLabel = oSeq.Label
	newrepr = sLabel
	newLabel = oDataProvider.createDataSequenceByRangeRepresentation("Tableau2.A1:A1")
	newLabel.Role = oLabel.Role
	newseqLabel = CreateUnoService("com.sun.star.chart2.data.LabeledDataSequence")
	newseqLabel.Label = newLabel

	with oDiag.DataSequences(0)
		.setLabel(newseqLabel.label)
		.setValues(newseqValues.values)
	end with

	oSeq = oDatasequences(1)
	oValues = oSeq.Values
	newrepr = sValeurs
	newvalues = oDataProvider.createDataSequenceByRangeRepresentation("Tableau2.B2:B5")
	newvalues.Role = oValues.Role
	newseqValues = CreateUnoService("com.sun.star.chart2.data.LabeledDataSequence")
	newseqValues.Values = newvalues

	oLabel = oSeq.Label
	newrepr = sLabel
	newLabel = oDataProvider.createDataSequenceByRangeRepresentation("Tableau2.B1:B1")
	newLabel.Role = oLabel.Role
	newseqLabel = CreateUnoService("com.sun.star.chart2.data.LabeledDataSequence")
	newseqLabel.Label = newLabel

	with oDiag.DataSequences(1)
		.setLabel(newseqLabel.label)
		.setValues(newseqValues.values)
	end with

je pense que nous allons mieux nous y retrouver (mais nous progressons!) avec le tableur en annexe !

j’ai mis 4 boutons … les 2 premiers fonctionnent bien ! … mais pas les 2 autres … naturellement !

le problème est avec oDataSequences … quand on le redimensionne, puis on met à jour les diagrammes … cela ne fonctionne pas ! si vous interroger le diagramme il continue avec 7 séquences !

plage.odt (25.2 KB)

j’ai l’impression qu’une fois cela résolu … ça sera tout bon ! :slight_smile: (mais je suis très mauvais pour les prévisions! j’ai souvent de mauvaises surprise ! :slight_smile: )

pour gagner du temps :

sub oDataSequenceTest
dim o, oExt, document, oDiag, oDataSequences
’ récupère le diagramme (unique dans le document)
document = ThisComponent.CurrentController.Frame
o = document.controller.model.embeddedObjects.getByIndex(0)
oExt = o.ExtendedControlOverEmbeddedObject
oDiag = oExt.component
oDatasequences = oDiag.DataSequences
msgBox "uBound(oDatasequences) = " & cstr(uBound(oDatasequences))
end sub

Désolé, pas le temps de déboguer ton programme mais si tu réduis la plage de données tu dois sans doute supprimer les datasequences “en trop” par exemple :
oDiag.DataSequences(3).dispose

Nota : commencer par la fin bien entendu

pas de souci ! je ne suis pas pressé !

merci pour le tuyau … je teste !

bon travail,
Philippe

j’ai essayé … propriété ou méthode dispose n’existe pas
j’ai vu avec MRI que release existe … mais ça me donne le même message

j’ai essayé erase oDiag.DataSequences(3) … il ne réclame pas … mais après mise à jour il y a toujours 7 séquences !

ceci étant je ne pense pas que cela puisse être le chemin ! … redim doit suffire ! (les objects en trop sont sans doute disposés du reste ou sinon cela n’influence pas sur la taille de l’array dataSequences.

ne devrait-on pas monter un nouveau dataSequences complet et remplacer l’ancien par le nouveau ?

je vais essayer plus tard !

bien à vous … ne vous croyez pas obligé d’interrompre vos activités pour me répondre … je répète, je ne suis pas pressé ! et j’ai déjà beaucoup abusé !
Philippe

vérifie (double clic sur le graphique) que la plage est bonne (Donnees.A1:G5) puis fait cet appel à mri :

sub ModifSourceDiagramme(colonnes, derniereLigne as integer)

dim o, oExt, document, oDiag, oDataProvider, oDataSequences
dim dimDataSequences as integer, numColonne as integer, nc1 as integer, col as string

dim uColonnes as integer : uColonnes = ubound(colonnes)

	' récupère le diagramme (unique dans le document)
	document = ThisComponent.CurrentController.Frame
	o = document.controller.model.embeddedObjects.getByIndex(0)
	oExt = o.ExtendedControlOverEmbeddedObject
	oDiag = oExt.component	

	oDataProvider = oDiag.getDataProvider()
	oDatasequences = oDiag.DataSequences
	
	mri oDiag.DataSequences(6)

Non car c’est “ta” variable que tu redimensionnes

	oDatasequences = oDiag.DataSequences

pas la propriété de l’objet diagramme oDiag.DataSequences

j’ai déjà fait … et j’ai aussi regardé le contenu qui semble tout à fait convenable !

donc mon idée de recréer DataSequences et de remplacer l’ancienne version semble raisonnable … je vais m’y atteler un peu plus tard !

avec ce commentaire je ne peux savoir si tu as trouvé la méthode dispose ou non… Tu dois obtenir

(padron pour l’envoi antérieur!)

pas de dispose chez moi ! comment est-ce possible … le reste est pourtant égal !

j’en profite … si c’est une copie de dataSequences, comment les modifs que je fais dans la copie peuvent être prises en compte dans l’original ?

2022-05-10 13_54_45-MRI.png

J’ai pris le temps de faire un exemple simple :

  • ouvrir le doc joint
  • vérifier la plage de données (devrait être Tableau2.A1:D5), sortir du mode édition de graphique
  • sélectionner le graphique
  • cliquer sur le bouton A1:C3

Nota : il semble qu’il y ait un bug dans cette version de LibreOffice car, hors macro :

  • créer le diagramme fondé sur Tableau2.A1:D5
  • enregistrer le doc
  • recharger le doc
  • vérifier la plage de données du graphique qui est devenue erronée Tableau2.A2:A5;Tableau2.B1:D5

Ceci dit, en revanche la macro de “réduction” fonctionne correctement en partant de références correctes

RéduireDiagramme.odt (21,9 Ko)

bug … je t’ai parlé de bug il y a quelques jours, c’était celui que tu décris, j’ai ouvert un bug qui a été confirmé.
malgré ce bug tu peux cliquer sur OK que la fenêtre se ferme normalement et le graphique est présenté correctement également. l’erreur vient du montage de la plage à partir du contenu … il se mélange complètement …

depuis j’ai trouvé 2 autres bugs ! :slightly_smiling_face: … en edition du graphique, si tu passes la souris sur les barres la valeur est souvent à 0 alors que la hauteur de la barre est correctte. l’autre, qui n’est quand même peut-être pas un bug mais est différent de Calc, c’est que les minuscules ne sont pas acceptées dans la description de la plage ( Tableau.A1:c3 est rejeté à cause du “c”)

je suis impatient de regarder ton exemple! :slightly_smiling_face: … merci … mais fais en fonction de ton temps ! ce petit problème n’a rien d’urgent ni d’important !

Philippe

tu ne vas pas être surpris !

toujours pas de dispose ici ! :slightly_frowning_face:

ceci étant … j’ai déroulé ma fonction avec le Redim pour avoir A1:C3, à partir de A1:G5

si à la fin de la fonction on regarde dans oDiag on a

  • une propriété usedData qui a encore 7 dataSequences
  • une propriété data qui a bien 4 data
    apparemment les données pour les descriptions d’entête sont correctes

image.pngimage.png

après la mise à jour des charts ce qu’il y a en data continue correct avec ses 4 éléments!

image.png

ma version
Version: 7.3.2.2 (x64) / LibreOffice Community
Build ID: 49f2b1bff42cfccbd8f788c8dc32c1c309559be0
CPU threads: 2; OS: Windows 6.1 Service Pack 1 Build 7601; UI render: Skia/Raster; VCL: win
Locale: fr-FR (pt_BR); UI: pt-BR
Calc: threaded

test avec un notebook w10 a montré la même occurence … pas de dispose. mais c’est la même version de L.O. alors ce n’est pas très conclusif !

Tu ne dis pas si tu as essayé RéduireDiagramme.odt (21,9 Ko)
en suivant

  • ouvrir le doc joint
  • vérifier la plage de données (devrait être Tableau2.A1:D5), sortir du mode édition de graphique
  • sélectionner le graphique
  • cliquer sur le bouton A1:C3