Hallo liebe Community!
Ich habe folgende Situation:
Ich lasse aus einer Datentabelle heraus ein Chart erstellen. Dieses Chart (Grafik5), hat 2 Datenreihen:
Grafik5.SeriesCollection(1)
und
Grafik5.SeriesCollection(2)
Für mich ist zur Darstellung in einem Balkendiagramm nur Grafik5.SeriesCollection(1) wichtig. Grafik5.SeriesCollection(2) hingegen, zeigt mir %-Zahlen, die ich über dem jeweiligen Balken von Grafik5.SeriesCollection(1), als Datenbeschriftung, positionieren möchte!
Jetzt habe ich das schon mal soweit, dass ich über
Grafik5.ChartGroups(1).Overlap = 100
beide Datenreihen überlappen lasse und dann sage ich einfach, dass Grafik5.SeriesCollection(2), keine Füllung und keine Linienfarbe haben soll:
Grafik5.SeriesCollection(2).Format.Fill.Visible = msoFalse
Grafik5.SeriesCollection(2).Format.Line.Visible = msoFalse
Somit, ist Grafik5.SeriesCollection(2) "unsichtbar" und dann lasse ich mir die Datenbeschriftung anzeigen....
Der Code bisher sieht mal so aus...:
So.... Nun zum eigentlichen Knackpunkt...
1.) Automatisierte Positionierung der Datenbeschriftungen:
Man kann ja über:
VBA sagen, wo die einzelnen Datenbeschriftungswerte positioniert werden sollen....
mit .Points(1) wird die erste Beschriftung vom ersten "x-Wert" positioniert usw... --> jetzt möchte ich aber keine absolute Position angeben... sondern...:
Ich will, über VBA die Position selbst bestimmen lassen! z.b. jetzt für den ersten Beschriftungswert:
Excel, soll schauen, bis wohin sich der Balken von Grafik5.SeriesCollection(1), beim ersten x-Wert, hin erstreckt und soll dann darüber, die via Grafik5.SeriesCollection(2).Points(1).DataLabel.Top die Beschriftung positionieren!
--> Somit:
Ich würde gerne wissen, wie ich das anstellen kann, dass ich die "Endposition" (sowohl .Top als auch .Left - Wert) von dem gezeichneten Balken herausbekomme.. sodass ich dann dementsprechend die Position setzen kann....
Und:
Das soll dann auch für alle Punkte funktionieren... somit... wenn ich beispielsweise 10 x-Werte habe... und somit eigentlich Points(1).DataLabel.Top bis Points(10).DataLabel.Top habe... dann muss das für alle 10 laufen...
2.) Automatisierte Formatierung der Datenbeschriftung, abhängig vom Wert...
über:
kann ich ja die Schriftfarbe setzen... in dem Fall, ist es einfach rot....
Jetzt möchte ich aber die Formatierung abhängig vom jeweiligen Wert machen! Somit, soll die Schriftfarbe Schwarz sein, wenn der jeweilige Wert 0 ist - und sonst soll die Schriftfarbe rot sein, wenn der jeweilige Wert >0 ist!
Damit ich das mit einer IF-Then Anweisung hinbekomme... muss ich aber Excel irgendwie mitteilen können, dass er drauf schauen soll...
Somit:
Wie kann ich das in VBA umsetzen, dass die Schriftfarbe abhängig vom "Y-Wert" der Datenreihe ist??
Bin echt dankbar über Vorschläge und Lösungsansätze...
VG Tim
NACHTRAG!!:
Mir ist gerade die Idee gekommen... ich kann mir ja auch einfach die Datenbeschriftung von Grafik5.SeriesCollection(1) anzeigen lassen....
dann... mir diese Positionswerte abspeichern (in eine Variable...) lassen...
dann... die Datenbeschriftung von Grafik5.SeriesCollection(1) wieder entfernen...
und dann die Datenbeschriftung von Grafik5.SeriesCollection(2) mit diesen Werten wieder hinzufügen....
ABER!
Dann muss ich immer noch wissen, wie ich die Positionswerte von Grafik5.SeriesCollection(1) auslesen kann.... und wie ich das abspeichere? Array?
DANKE!
Ich habe folgende Situation:
Ich lasse aus einer Datentabelle heraus ein Chart erstellen. Dieses Chart (Grafik5), hat 2 Datenreihen:
Grafik5.SeriesCollection(1)
und
Grafik5.SeriesCollection(2)
Für mich ist zur Darstellung in einem Balkendiagramm nur Grafik5.SeriesCollection(1) wichtig. Grafik5.SeriesCollection(2) hingegen, zeigt mir %-Zahlen, die ich über dem jeweiligen Balken von Grafik5.SeriesCollection(1), als Datenbeschriftung, positionieren möchte!
Jetzt habe ich das schon mal soweit, dass ich über
Grafik5.ChartGroups(1).Overlap = 100
beide Datenreihen überlappen lasse und dann sage ich einfach, dass Grafik5.SeriesCollection(2), keine Füllung und keine Linienfarbe haben soll:
Grafik5.SeriesCollection(2).Format.Fill.Visible = msoFalse
Grafik5.SeriesCollection(2).Format.Line.Visible = msoFalse
Somit, ist Grafik5.SeriesCollection(2) "unsichtbar" und dann lasse ich mir die Datenbeschriftung anzeigen....
Der Code bisher sieht mal so aus...:
Visual Basic-Quellcode
- Private Sub CommandButton5_Click()
- Dim Grafik5 As Chart
- Dim spaltindex As Long
- spaltindex = Tabelle7.Cells(1, Columns.Count).End(xlToLeft).Column
- Set Grafik5 = Charts.Add
- 'Werte von IH-Gesamtkosten
- Grafik5.SeriesCollection.NewSeries
- Grafik5.SeriesCollection(1).Name = Tabelle7.Cells(120, 4)
- Grafik5.SeriesCollection(1).Values = Tabelle7.Range(Tabelle7.Cells(120, 5), Tabelle7.Cells(120, spaltindex))
- Grafik5.SeriesCollection(1).XValues = Tabelle7.Range(Tabelle7.Cells(1, 5), Tabelle7.Cells(1, spaltindex))
- 'Werte von %-Fehler...
- Grafik5.SeriesCollection.NewSeries
- Grafik5.SeriesCollection(2).Name = Tabelle7.Cells(121, 4)
- Grafik5.SeriesCollection(2).Values = Tabelle7.Range(Tabelle7.Cells(121, 5), Tabelle7.Cells(121, spaltindex))
- Grafik5.SeriesCollection(2).XValues = Tabelle7.Range(Tabelle7.Cells(1, 5), Tabelle7.Cells(1, spaltindex))
- With Grafik5
- .ChartType = xlColumnClustered
- End With
- 'Grafik-Layout 5 (--> mit Datentabelle etc.)
- Grafik5.ApplyLayout (5)
- Grafik5.Axes(xlValue).AxisTitle.Delete
- Grafik5.ChartTitle.Text = "IH-Gesamtkosten über die Jahre"
- Grafik5.ChartTitle.Format.TextFrame2.TextRange.Characters.Text = "IH-Gesamtkosten über die Jahre"
- With Grafik5.ChartTitle.Format.TextFrame2.TextRange.Characters(1, 19).ParagraphFormat
- .TextDirection = msoTextDirectionLeftToRight
- .Alignment = msoAlignCenter
- End With
- 'Datenreihen einfärben etc...
- With Grafik5.SeriesCollection(1).Format.Fill
- .Visible = msoTrue
- .ForeColor.ObjectThemeColor = msoThemeColorAccent3
- .ForeColor.TintAndShade = 0
- .ForeColor.Brightness = -0.25
- .Transparency = 0
- .Solid
- End With
- Grafik5.ChartGroups(1).Overlap = 100
- Grafik5.SeriesCollection(2).Format.Fill.Visible = msoFalse
- Grafik5.SeriesCollection(2).Format.Line.Visible = msoFalse
- Grafik5.SeriesCollection(2).ApplyDataLabels
- Grafik5.SeriesCollection(2).DataLabels.Select
- Grafik5.SeriesCollection(2).Points(1).DataLabel.Left = 112.656
- Grafik5.SeriesCollection(2).Points(1).DataLabel.Top = 100
- Grafik5.SeriesCollection(2).Points(2).DataLabel.Top = 100
- With Grafik5.SeriesCollection(2).Points(1).DataLabel.Format.TextFrame2.TextRange.Font.Fill
- .Visible = msoTrue
- .ForeColor.RGB = RGB(255, 0, 0)
- .Transparency = 0
- .Solid
- End With
- End Sub
So.... Nun zum eigentlichen Knackpunkt...
1.) Automatisierte Positionierung der Datenbeschriftungen:
Man kann ja über:
VBA sagen, wo die einzelnen Datenbeschriftungswerte positioniert werden sollen....
mit .Points(1) wird die erste Beschriftung vom ersten "x-Wert" positioniert usw... --> jetzt möchte ich aber keine absolute Position angeben... sondern...:
Ich will, über VBA die Position selbst bestimmen lassen! z.b. jetzt für den ersten Beschriftungswert:
Excel, soll schauen, bis wohin sich der Balken von Grafik5.SeriesCollection(1), beim ersten x-Wert, hin erstreckt und soll dann darüber, die via Grafik5.SeriesCollection(2).Points(1).DataLabel.Top die Beschriftung positionieren!
--> Somit:
Ich würde gerne wissen, wie ich das anstellen kann, dass ich die "Endposition" (sowohl .Top als auch .Left - Wert) von dem gezeichneten Balken herausbekomme.. sodass ich dann dementsprechend die Position setzen kann....
Und:
Das soll dann auch für alle Punkte funktionieren... somit... wenn ich beispielsweise 10 x-Werte habe... und somit eigentlich Points(1).DataLabel.Top bis Points(10).DataLabel.Top habe... dann muss das für alle 10 laufen...
2.) Automatisierte Formatierung der Datenbeschriftung, abhängig vom Wert...
über:
kann ich ja die Schriftfarbe setzen... in dem Fall, ist es einfach rot....
Jetzt möchte ich aber die Formatierung abhängig vom jeweiligen Wert machen! Somit, soll die Schriftfarbe Schwarz sein, wenn der jeweilige Wert 0 ist - und sonst soll die Schriftfarbe rot sein, wenn der jeweilige Wert >0 ist!
Damit ich das mit einer IF-Then Anweisung hinbekomme... muss ich aber Excel irgendwie mitteilen können, dass er drauf schauen soll...
Somit:
Wie kann ich das in VBA umsetzen, dass die Schriftfarbe abhängig vom "Y-Wert" der Datenreihe ist??
Bin echt dankbar über Vorschläge und Lösungsansätze...
VG Tim
NACHTRAG!!:
Mir ist gerade die Idee gekommen... ich kann mir ja auch einfach die Datenbeschriftung von Grafik5.SeriesCollection(1) anzeigen lassen....
dann... mir diese Positionswerte abspeichern (in eine Variable...) lassen...
dann... die Datenbeschriftung von Grafik5.SeriesCollection(1) wieder entfernen...
und dann die Datenbeschriftung von Grafik5.SeriesCollection(2) mit diesen Werten wieder hinzufügen....
ABER!
Dann muss ich immer noch wissen, wie ich die Positionswerte von Grafik5.SeriesCollection(1) auslesen kann.... und wie ich das abspeichere? Array?
DANKE!
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ereza“ ()