Diagramm Range per Makro ändern

Hallo,
ich versuche per makro Parameter von Diagrammen (Charts) zu verändern.
Das gelingt nur teilweise.

Der Code funktioniert nicht:
'''' Geht nicht. Zerstört das Diagramm!
'' Der Versuch die Ranges der Diagramme zu verändern
' cRg=Chart.getRanges()
' For j=1 To ubound(cRg)
'
' If cRg(j).EndRow <> 550 then
' cRg(j).EndRow=550
' debug=debug & "Cart(" & i & ") Range(" & j & ")" & chr(10)
' End if
' Next j
' Chart.setRanges(cRg)
Danach ist das Diagramm kaputt: Die Datenbereiche sind weg. Weiter hab
ich garnicht
mehr nachgesehen.

Den Code habe ich teilweise aus OOME von Andrew Pintonyak
Was ist da Falsch? Greife ich eventuell
Hinweise aus dieselbe Beobachtung hab ich im Netz auch gefunden,
leider keine Lösung :frowning:
<https://oooforum.de/viewtopic.php?t=50127>
<https://de.openoffice.info/viewtopic.php?t=11097>

Die komplette Routine:
----8<-----
public Sub SetChartXAxisMinDate()
'** Das Startdatum der Skala setzen
'** Wird von den Ereignissen "Text geändert" und "Nach Aktualisierung" des
'** Controls "ChartXAxisMinDate" (Tab Diagramme, Datumsfeld rechts Oben)
getriggert
dim ChartDoc
   Dim Charts As Object
   Dim Chart as Object
   Dim oSheet
   Dim oForm
   Dim i%
   Dim aDate
   Dim DateStr$
   Dim size
   Dim Cell
   Dim debug$
   Dim cRg
   Dim j%

  cRg=createUnoStruct("com.sun.star.table.CellRangeAddress")
     size=createUnoStruct("com.sun.star.awt.Size")
     oSheet=Thiscomponent.sheets.getByName("Diagramme")
     oForm=oSheet.Drawpage.Forms.getByName("Formular")
     Cell=oSheet.getCellRangeByName("N7")
     aDate = createUnoStruct("com.sun.star.util.Date") 'Holen des Datums
geht nur mit der struct
     aDate=oForm.getByName("ChartXAxisMinDate").Date ' .Text ist nicht
immer aktuell??
    'DateStr=aDate.Day & "." & aDate.Month & "." & aDate.Year
  DateStr = ConvertDateTime(aDate, "STRING") '''' --> mytools.modDate
  Cell.String=Datestr

'Mri oSheet.Charts.getByIndex(0)
     For i=0 To oSheet.Charts.count-1
       Chart = oSheet.Charts.getByIndex(i)
    ChartDoc = Chart.getEmbeddedObject()

    if i=0 then 'Für den Test. Nur das 1. Diagramm
'''' Geht nicht. Zerstört das Diagramm!
'' Der Versuch die Ranges der Diagramme zu verändern
' cRg=Chart.getRanges()
' For j=1 To ubound(cRg)
'
' If cRg(j).EndRow <> 550 then
' cRg(j).EndRow=550
' debug=debug & "Cart(" & i & ") Range(" & j & ")" & chr(10)
' End if
' Next j
' Chart.setRanges(cRg)

      'msgbox ChartDoc.Diagram.XAxis.NumberFormat
'''' Geht nicht
'' Der Versuch die Grösse der Diagramme zu ändern
      size=ChartDoc.Drawpage.getByIndex(0).getSize()
      msgbox size.width 'ist immer 31286
      size.Width=40000 'Damit eine Veränderung sichtbar würde
      ChartDoc.Drawpage.getByIndex(0).Size=size
      size=ChartDoc.Drawpage.getByIndex(0).getSize()
      msgbox size.width 'Zeigt die Änderung an. Aber es wird nicht wirklich
geändert
    End If
  
    ChartDoc.Diagram.XAxis.Min=DateValue(DateStr) '09.11.2020
    'ChartDoc.Diagram.XAxis.NumberFormat=141 'NN TT.MM
    ChartDoc.Diagram.XAxis.NumberFormat=131 'TT.MM
  Next i
'mri Chart
End Sub

Hallo Bernd,

schau mal hier

http://oooforum.de/viewtopic.php?t=68337

da erstellt einer ein Diagramm via Makro:

http://oooforum.de/download/file.php?id=15089&sid=92a73019698b14b0392d404b84206836

CALC-Datei mit Makro zum Download (das Makro funktioniert, hab's eben ausprobiert)

Vielleicht hilft Dir das weiter,
viele Grüße

Hans-Werner :-))

------ Originalnachricht ------

Hi,
Danke :slight_smile: Solche Beispiele gibt es zuhauf :slight_smile:
Es wird immer die Methode addNewByName verwendet.
Bei mir existieren die Diagramme ja schon.
Die Datenbasis ändert sich aber täglich (wird grösser).
Also will ich den Datenbereich anpassen.
Dafür hab ich bis jetzt keine Doku gefunden.
Das, was ich hier als Code habe, habe ich bei Andrew Pitonyak bzw. mit
Mri und xray
herausgefunden.

Wie geschrieben wird dadurch das Diagramm zerstört. Ich vermute daher,
dass ich falsch
darauf zugreife. Nur, wie wärs richtig?

Hallo Bernd,

ich habe in der Ecke noch nie was programmiert, habe das aber mal nachgestellt. Einen Fehler in deinem Code habe ich festgestellt, deine Schleife läuft ab 1, der Index von Ranges beginnt aber bei 0.
Mein einfaches Beispiel mit drei Spalten und zwei Zeilen plus Überschrift funktioniert mit deinem Code, wenn ich die Schleife bei 0 beginnen lasse.
Fange ich bei 1 an, passiert logischerweise gar nichts, weil ubound (Ranges) = 0 ist. Es fehlen dann auch keine Daten.
Ich weiß nun gar nicht, wie ein Diagramm aussehen muss, damit Ranges mehr als ein Element hat, deshalb kann ich derzeit auch nicht weiter ausprobieren.
Aber der Start bei 1 ist auf jeden Fall falsch, versuche mal, was passiert, wenn du mit 0 startest.

Gruß

Gerhard

Hallo Gerhard,
Danke für die Mühe :slight_smile: Richtig. Das war zu Testzwecken so.

Habe mich jetzt aber nochmal dran gemacht und, warum auch immer,
es geht jetzt :slight_smile:

[...]
oDataRange=GetRangeOfNumericCells(Thiscomponent.sheets.getByName("Datenbereich"))
DataLastRow=oDataRange(0).EndRow ' Die letzte Zeile des Datenbereichs
cRg=createUnoStruct("com.sun.star.table.CellRangeAddress")
[...]
cRg=Chart.getRanges()
For j=0 To ubound(cRg)
  If cRg(j).EndRow <> DataLastRow then
    cRg(j).EndRow=DataLastRow-1 'setzt immer 1 mehr. Warum?
  End if
Next j
Chart.setRanges(cRg)
[...]

Das Array cRg enthält die Range für jeden Datenbereich, der im Diagramm
angezeigt
wird.