mikele hat geschrieben: ↑Mo 6. Mai 2024, 22:23
Hallo,
dem Tabellenereignis "Auswahl geändert" ist das Makro Chart.onSelect zugeordnet. Dieses zerschießt die Funktionalität "meines" Makros, da darin ja die Auswahl geändert wird (womit das Ereignis ausgelöst wird). Ich habe auch noch nicht verstanden, was du mit den Ereignissen bewirken willst.
Aus irgendwelchen Gründen werden die Daten in dem kopierten Diagramm aber nicht angezeigt
Die Prozeduren, die den Tabellenereignissen zugeordnet sind, interferieren nicht mit denen, die das Diagramm betreffen - onFocus stößt zwar AdjChart an (~ "Diagramm anpassen"), übergibt auch die dem Diagramm entsprechende Objektvariable, interagiert aber nicht weiter damit.
onSelect "bewirkt" die Erkennung von Klick-Ereignissen (4 Auslösungen für dieselbe Auswahl rufen dann onClick auf) und erlaubt "per Klick" (auf die Zelle K1 (und im "debug mode" L1 oder M1) die Anzeige der Information für die Seiten (in den Spalten K und L) umzuschalten. In dem Sinne ändert "Dein" Makro die Auswahl nirgends. ("Auswahl geändert" ist ohnehin eine eher unglückliche Übersetzung von onSelect.)
Code: Alles auswählen
sub test2
odoc=ThisComponent
otab=oDoc.Sheets.getByName("Grafik")
oDp=otab.Drawpage
' finde das shape mit dem Diagramm für den Vormonat - hier mit dem Index 0:
for i=0 to oDp.Count-1
if oDp.getByIndex(i).name="Diagramm24·03" then
oShape=oDp.getByIndex(i)
end if
next
' kopiere das shape ...:
oCtrl = oDoc.CurrentController
theFr = oCtrl.Frame
dispH = createUnoService("com.sun.star.frame.DispatchHelper")
oCtrl.select(oshape) ' löst möglicherweise ein einzelnes onSelect-Ergeignis (ohne weitere Konsequenz) aus
dispH.executeDispatch(theFr, ".uno:Copy", "", 0, Array())
oCtrl.setActiveSheet(otab) ' löst möglicherweise ein onFocus-Ereignis aus (das könnte wiederum ander Przeduren anstoßen)
oZiel=otab.getcellrangebyname("H35")
' füge das kopierte shape auf der Seite für den Monat ein:
dispH.executeDispatch(theFr, ".uno:Paste", "", 0, Array())
newSh = oDoc.CurrentSelection(0)
' ... und benenne es:
newSh.name="Diagramm24·04"
pos=oziel.position
pos.x=pos.x+oshape.size.height
pos.y=pos.y+220
newsh.setPosition(pos)
' Bis hier wird das alles mit AddNewPage in "Beispiel für LO-Forum v.44w.ods" erledigt.
' Die Variablen für die kopierten und eingefügten (und jeweils eingebetteten) Objekte
' und ihre Komponenten sehen in der IDE (nach Namen, Eigenschaften, Hierarchie usw.) genauso aus.
' Was folgt soll in "Beispiel für LO-Forum v.44w.ods" in AdjChart, bzw. AdjChartX passieren
'
odia=newsh.embeddedobject.component ' heißt im Beispiel oChart
odia.title.string=newSh.name ' funktioniert im Beispiel nicht
' stattdessen funktioniert:
' oChart.embeddedObject.TitleObject.text(0).string
' aber oChart ist ein "com.sun.star.comp.chart2.ChartModel", kein shape
'
odia_alt=otab.charts.getbyname(oShape.EmbeddedObject.EntryName)
' wird im Beispiel in sub getPages gelesen und in sPgInfo hinterlegt (im debug mode in Spalte L auch gezeigt)
' oPgChrt(i)=oSheet.charts.getByName(.EntryName) ' ◄◄◄
' sPgInfo(i,7)=.EntryName
' sPgInfo(i,8)=sRanges(oPgChrt(i).getRanges)
daten=odia_alt.getRanges
' finde das (Daten-)Tabellenblatt für den neuen Monat hier mit Index 1
nr_DatenTab=oDoc.Sheets.getByName("24·04").RangeAddress.Sheet
for i=0 to ubound(daten)
daten(i).sheet=nr_DatenTab
next
' with oChart
' oRanges=.getRanges ' getRanges gets oChart.Ranges - but oChart has .RelatedCellRanges, too
' iSht=oRanges(0).sheet-1
' for i=0 to UBound(oRanges) : oRanges(i).sheet=iSht : next
' end with
'
' ... und die Ergebnisse sehen bis hier perfekt aus ...
odia_neu=otab.charts.getbyname(newSh.EmbeddedObject.EntryName) ' ◄◄◄
' aber setRanges produziert Müll
odia_neu.setRanges(daten)
' diese, neuen, missratenen, ranges des per copy&paste produzierten Diagramms
Was ich meine aus dem Beispiel gelernt zu haben:
Die sichere Identifikation des jeweiligen Diagramms ist nur über die Form möglich, in die es eingebettet ist und die durch ihren Anker mit dem Tabellenblatt verbunden ist.
Die Lösung für die Anpassung der Datenbereiche fehlt mir aber nach wie vor.
Es scheint mir auch, dass die in "Ranges" enthaltenen Daten viel zu sparsam sind um darin die Funktionalität des Diagramms abzubilden. Erheblich mehr ist in den "RelatedCellRanges" zu finden. Mir fehlt aber jeder Ansatz, wie ich die aus dem "alten" Diagramm auslesen und angepasst in das "neue" Diagramm füttern sollte (also die entsprechende Analogie zu setRanges).
(Die Anpassung der Daten in RelatedCellRanges wäre nicht das Problem.)
Übrigens, der beobachtete Effekt, dass der setRanges-Befehl die Daten aus beiden Diagrammen gleichzeitig löschte, kam von einer versehentlich falschen Einstellung des "Ziehmodus" (auf "hyperlink"). Keine Ahnung, wie das da rein gerutscht ist - aber copyRange scheint die jeweilige Einstellung zu übernehmen.