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
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 ?
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 !
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 ! (mais je suis très mauvais pour les prévisions! j’ai souvent de mauvaises surprise !
)
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 !
(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 ?
J’ai pris le temps de faire un exemple simple :
Nota : il semble qu’il y ait un bug dans cette version de LibreOffice car, hors macro :
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 ! … 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! … merci … mais fais en fonction de ton temps ! ce petit problème n’a rien d’urgent ni d’important !
Philippe
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
après la mise à jour des charts ce qu’il y a en data continue correct avec ses 4 éléments!
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