DataLabel bei Charts automatisiert über VBA anpassen...

  • Excel

    DataLabel bei Charts automatisiert über VBA anpassen...

    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...:

    Visual Basic-Quellcode

    1. Private Sub CommandButton5_Click()
    2. Dim Grafik5 As Chart
    3. Dim spaltindex As Long
    4. spaltindex = Tabelle7.Cells(1, Columns.Count).End(xlToLeft).Column
    5. Set Grafik5 = Charts.Add
    6. 'Werte von IH-Gesamtkosten
    7. Grafik5.SeriesCollection.NewSeries
    8. Grafik5.SeriesCollection(1).Name = Tabelle7.Cells(120, 4)
    9. Grafik5.SeriesCollection(1).Values = Tabelle7.Range(Tabelle7.Cells(120, 5), Tabelle7.Cells(120, spaltindex))
    10. Grafik5.SeriesCollection(1).XValues = Tabelle7.Range(Tabelle7.Cells(1, 5), Tabelle7.Cells(1, spaltindex))
    11. 'Werte von %-Fehler...
    12. Grafik5.SeriesCollection.NewSeries
    13. Grafik5.SeriesCollection(2).Name = Tabelle7.Cells(121, 4)
    14. Grafik5.SeriesCollection(2).Values = Tabelle7.Range(Tabelle7.Cells(121, 5), Tabelle7.Cells(121, spaltindex))
    15. Grafik5.SeriesCollection(2).XValues = Tabelle7.Range(Tabelle7.Cells(1, 5), Tabelle7.Cells(1, spaltindex))
    16. With Grafik5
    17. .ChartType = xlColumnClustered
    18. End With
    19. 'Grafik-Layout 5 (--> mit Datentabelle etc.)
    20. Grafik5.ApplyLayout (5)
    21. Grafik5.Axes(xlValue).AxisTitle.Delete
    22. Grafik5.ChartTitle.Text = "IH-Gesamtkosten über die Jahre"
    23. Grafik5.ChartTitle.Format.TextFrame2.TextRange.Characters.Text = "IH-Gesamtkosten über die Jahre"
    24. With Grafik5.ChartTitle.Format.TextFrame2.TextRange.Characters(1, 19).ParagraphFormat
    25. .TextDirection = msoTextDirectionLeftToRight
    26. .Alignment = msoAlignCenter
    27. End With
    28. 'Datenreihen einfärben etc...
    29. With Grafik5.SeriesCollection(1).Format.Fill
    30. .Visible = msoTrue
    31. .ForeColor.ObjectThemeColor = msoThemeColorAccent3
    32. .ForeColor.TintAndShade = 0
    33. .ForeColor.Brightness = -0.25
    34. .Transparency = 0
    35. .Solid
    36. End With
    37. Grafik5.ChartGroups(1).Overlap = 100
    38. Grafik5.SeriesCollection(2).Format.Fill.Visible = msoFalse
    39. Grafik5.SeriesCollection(2).Format.Line.Visible = msoFalse
    40. Grafik5.SeriesCollection(2).ApplyDataLabels
    41. Grafik5.SeriesCollection(2).DataLabels.Select
    42. Grafik5.SeriesCollection(2).Points(1).DataLabel.Left = 112.656
    43. Grafik5.SeriesCollection(2).Points(1).DataLabel.Top = 100
    44. Grafik5.SeriesCollection(2).Points(2).DataLabel.Top = 100
    45. With Grafik5.SeriesCollection(2).Points(1).DataLabel.Format.TextFrame2.TextRange.Font.Fill
    46. .Visible = msoTrue
    47. .ForeColor.RGB = RGB(255, 0, 0)
    48. .Transparency = 0
    49. .Solid
    50. End With
    51. End Sub



    So.... Nun zum eigentlichen Knackpunkt...

    1.) Automatisierte Positionierung der Datenbeschriftungen:
    Man kann ja über:

    Visual Basic-Quellcode

    1. Grafik5.SeriesCollection(2).Points(1).DataLabel.Left =...
    2. Grafik5.SeriesCollection(2).Points(1).DataLabel.Top = ..


    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:

    Visual Basic-Quellcode

    1. With Grafik5.SeriesCollection(2).Points(1).DataLabel.Format.TextFrame2.TextRange.Font.Fill
    2. .Visible = msoTrue
    3. .ForeColor.RGB = RGB(255, 0, 0)
    4. .Transparency = 0
    5. .Solid
    6. End With


    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“ ()