Seite 1 von 2

Balkendiagramm erstellen

Verfasst: Sa 25. Mär 2023, 00:36
von Ich Bins
Hallo zusammen,

in der Datei
Beispiel.ods
(43.36 KiB) 217-mal heruntergeladen
befinden sich in Tabelle1 ein manuell erstelles Balkendiagramm wie es benötige, nur zwei Balken und darunter die Werte.
Die Anordnung der Werte in B3 und B4 sind von der Original-Tabelle so vorgegeben.
In Tabelle2 ist mein Versuch das Balkendiagramm per Makro zu erstellen.
Dazu verwendete ich als Vorlage die etwas abgewandelte Subroutine aus dem letzten Beitrag des Threads
Balkendiagramm per Makro erstellen.

Code: Alles auswählen

Sub Diagramm2

Dim Doc As Object
Dim Charts As Object
Dim Chart as Object
Dim Rect As New com.sun.star.awt.Rectangle
Dim RangeAddress(1) As New com.sun.star.table.CellRangeAddress
Dim start_column1 as integer
Dim start_row1 as integer
Dim start_column2 as integer
Dim start_row2 as integer
REM ************ Setup ***************************************
start_column1 = 1	'1
start_row1 = 2
start_column2 = 3	'3
start_row2 = 2
REM ************ Diagram Creation ****************************
Doc = ThisComponent
Sheets = Doc.Sheets
Sheet = Sheets.getByName("Tabelle2")
Charts = Sheet.Charts
Rect.X = 8000
Rect.Y = 3000
Rect.Width = 8000
Rect.Height = 7000

RangeAddress(0).Sheet = 1
RangeAddress(0).StartColumn = start_column1
RangeAddress(0).StartRow = start_row1
RangeAddress(0).EndColumn = start_column1
RangeAddress(0).EndRow = start_row1 + 3

RangeAddress(1).Sheet = 1
RangeAddress(1).StartColumn = start_column2
RangeAddress(1).StartRow = start_row2
RangeAddress(1).EndColumn = start_column2
RangeAddress(1).EndRow = start_row2 + 3

Charts.addNewByName("MyChart1", Rect, RangeAddress(), True, True)
Chart = Charts.getByName("MyChart1").EmbeddedObject
Chart.Diagram = Chart.createInstance("com.sun.star.chart.BarDiagram")

Chart.Diagram.Wall.FillColor = RGB(255, 255, 255)
Chart.Diagram.HasYAxisDescription = 0
Chart.Diagram.HasYAxisGrid = 0
Chart.Diagram.YAxis.Min = 0 
Chart.Diagram.YAxis.Max = 30

End Sub
Die Balken per Makro im Diagramm in Tabelle2 anzuzeigen ist mir bisher nicht gelungen, wenn sich die beiden Werte in B3 und B4 befinden, ganz gleich wie ich start_column1, start_row1, start_column2, und start_row2 definiere.
Es funktioniert nur wenn sich die Werte in D4 und D5 befinden.
Wie ist es möglich das Diagramm per Makro zu erstellen, wenn sich die beiden Werte in B3 und B4 befinden und wie kann man die XY Skalen entfernen und die Datenbeschriftungen unter den Balken einfügen.

Viele Grüße
Ich Bins

Re: Balkendiagramm erstellen

Verfasst: Sa 25. Mär 2023, 12:39
von karolus
Hallo

Es ist aber ein Säulendiagramm und kein Balkendiagramm!

und manchmal hilfts Dinge zu vereinfachen

Code: Alles auswählen

Sub Diagramm_einfach

Dim Rect As New com.sun.star.awt.Rectangle

Doc = ThisComponent
Sheets = Doc.Sheets
Sheet = Sheets.getByName("Tabelle1")
Charts = Sheet.Charts
Rect.X = 8000
Rect.Y = 3000
Rect.Width = 8000
Rect.Height = 7000
'in A4:A5 stehen die gewünschten Beschriftungen'
chart_address = sheet.getCellRangeByName("A4:B5").getRangeAddress()
'auch eine einzelne addresse muss ins »array-köfferchen«'
ar_chart_Address = array(chart_address)

Charts.addNewByName("MyChart1", Rect, ar_chart_Address, False, True)'das letzte True für die Zeilenbeschriftung
Chart = Charts.getByName("MyChart1").EmbeddedObject
Chart.Diagram = Chart.createInstance("com.sun.star.chart.BarDiagram")
Chart.Diagram.Vertical = False 'True ergibt »Balkendiagramm« WTF??'
Chart.Diagram.Wall.FillColor = -1
Chart.Diagram.HasYAxisDescription = 0

End Sub

Re: Balkendiagramm erstellen

Verfasst: Sa 25. Mär 2023, 19:05
von Ich Bins
Hallo Karolus,

das ist ja schon sehr gut aus, vielen Dank.
Die von Dir vorgesehenen Zellen für die Säulenbeschriftungen sind in der Original-Tabelle bereits belegt.
Manuell kann man die Datenbeschriftung nach vorheriger Auswahl der Säule im Kontextmenue/Datenbeschriftung_einfügen.
Danach wird sie erst oben angezeigt. Nach der Auswahl der eingefügten Datenbeschriftung kann man diese über das Kontextmenue/Datenbeschriftung_formatieren Reiter Datenbeschriftung unterhalb platzieren.
Ich konnte bisher noch keine Möglichkeit finden das mit Basic zu erreichen.
Wie man die XY-Scalen entfernt konnte ich auch noch nicht herausfinden. In den Eigenschaften des Diagramms kann man sie manuell entfernen.
Leider auch noch nicht wie man die Säulen unterschiedlich färbt. Manuell geht das im Kontextmenü/Datenpunkt formatieren.
Mit oObjektfarbe

Code: Alles auswählen

oObjektfarbe = Chart.Diagram.getDataRowProperties(0)
objektfarbe.FillColor = RGB(255,0,0)'(0,0,255)
oObjektfarbe.FillStyle = 1
Kann man nur beide Säulen einheitlich färben.

Viele Grüße
Ich Bins

Re: Balkendiagramm erstellen

Verfasst: Di 28. Mär 2023, 13:15
von Ich Bins
Nach einem Doppelklick auf eine Säule des Diagrammes in Tabelle1 wird mit Mouseover über den Säulen
Datenpunkt 1, Datenreihe 1, Werte: 19,94
Datenpunkt 1, Datenreihe 2, Werte: 23,34
angezeigt.
Auch nach intensiver Suche konnte ich in den Dokumentationen und Foren noch keine Möglichkeit finden die Eigenschaften einer einzelne Datenreihe oder eines einzelnen Datenpunktes zu ändern.
Ist das überhaupt bei Säulendiagrammen mit StarBasic möglich?

Viele Grüße
Ich Bins

Re: Balkendiagramm erstellen

Verfasst: Di 28. Mär 2023, 14:02
von mikele
Hallo,

Code: Alles auswählen

Chart.Diagram.getDataPointProperties(0,0).FillColor=rgb(0,255,0)

Re: Balkendiagramm erstellen

Verfasst: Di 28. Mär 2023, 16:03
von Ich Bins
Hallo mikele,

vielen Dank, jetzt entspricht das mit Basic erstellte Diagramm fast dem manuell erstellten.
Nur der Abstand zw. Säulen ist noch zu groß.

Code: Alles auswählen

Sub Diagramm_einfach

Dim Rect As New com.sun.star.awt.Rectangle

Doc = ThisComponent
Sheets = Doc.Sheets
Sheet = Sheets.getByName("Tabelle1")
Charts = Sheet.Charts
Rect.X = 5000
Rect.Y = 2500
Rect.Width = 4000
Rect.Height = 3000

chart_address = sheet.getCellRangeByName("A3:B4").getRangeAddress()
ar_chart_Address = array(chart_address)

Charts.addNewByName("MyChart2", Rect, ar_chart_Address, False, True)
Chart = Charts.getByName("MyChart2").EmbeddedObject
Chart.Diagram = Chart.createInstance("com.sun.star.chart.BarDiagram")
Chart.Diagram.Wall.FillColor = -1
Chart.Diagram.HasYAxisDescription = 0
Chart.Diagram.HasYAxisGrid = 0
Chart.Diagram.HasYAxis = 0
Chart.Diagram.HasXAxis = 0
'Chart.Diagram.XAxis.Min = 0 
'Chart.Diagram.XAxis.Max = 70

Chart.Diagram.getDataPointProperties(0,0).FillColor=rgb(128,128,128)
Chart.Diagram.getDataPointProperties(1,0).FillColor=rgb(0,0,0)
Chart.Diagram.getDataPointProperties(0,0).DataCaption = 1
Chart.Diagram.getDataPointProperties(0,0).LabelPlacement = 6
Chart.Diagram.getDataPointProperties(1,0).DataCaption = 1
Chart.Diagram.getDataPointProperties(1,0).LabelPlacement = 6
End Sub

Re: Balkendiagramm erstellen

Verfasst: Di 28. Mär 2023, 23:07
von Ich Bins
Mit

Code: Alles auswählen

Chart.Diagram.YAxis.GapWidth = 20
konnte ich nun auch den Abstand zw. den Säulen einstellen.

Re: Balkendiagramm erstellen

Verfasst: Mi 29. Mär 2023, 10:33
von Ich Bins
Die Beschriftung (Wert) der linken Säulen kann man mit

Code: Alles auswählen

oChart.Diagram.getDataPointProperties(0,0).DataCaption = 1
sichtbar machen, aber wie ändert man jetzt noch die Schriftart und die Schriftgröße?

Re: Balkendiagramm erstellen

Verfasst: Mi 29. Mär 2023, 12:08
von karolus
Hat dich heute schon jemand auf die Verwendung von mri hingewiesen??

Code: Alles auswählen

bars = Chart.Diagram.getDataPointProperties
bar1, bar2 = bars(0,0), bars(1,0)

bar1.FillColor = int("808080",16)
bar2.FillColor = int("ffff00",16)
bar2.DataCaption = bar1.DataCaption = 1
bar2.LabelPlacement = bar1.LabelPlacement = 6
bar2.CharHeight = bar1.CharHeight = 42
bar2.CharFontName = bar1.CharFontName = "Cantarell Extra Bold"

Re: Balkendiagramm erstellen

Verfasst: Mi 29. Mär 2023, 14:57
von Ich Bins
Vielen Dank Karolus,

seltsamerweise hatte ich gestern mit CharHeight keinen Erfolg.

Code: Alles auswählen

oChart.Diagram.getDataPointProperties(0,0).CharHeight = 8
Heute funzts.

Wenn ich Deinen kompletten Lösungsvorschlag teste erhalte ich in der Zeile

Code: Alles auswählen

bar1, bar2 = bars(0,0), bars(1,0)
die Fehlermeldung:
BASIC-Syntaxfehler.
Unerwartetes Symbol: ,.

Zu MRI.
Bei meinen letzten Recherchen ist mir die Empfehlung MRI schon mehrfach begegnet.
Am Wochenende installierte ich MRI wie in dieser Anleitung beschrieben.

Weil ich danach im Macro (ganz egal bei welcher Variable) in der zweiten Zeile

Code: Alles auswählen

call InitializeMRI()
oMRI.inspect( Chart )
ein leeres MRI-Fenster erhalte und die MRI-Meldung "Void"
habe ich mich mit MRI nicht weiter befasst.

Wie muss denn

Code: Alles auswählen

Global oMRI As Object

Sub InitializeMRI()
  Globalscope.BasicLibraries.LoadLibrary("MRILib")
  oMRI = CreateUnoService("mytools.Mri")
End Sub
bei LO aussehen?