Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Balkendiagramm - Balken je nach Zellenwerten färben
#1
Moin zusammen,
mit der Hilfe hier aus dem Forum, konnte ich ein Kreisdiagramm je nach Wert färben.

Jetzt wollte ich das auch bei einem Balkendiagramm anwenden, und das funktioniert nicht.

Ausgang ist eine Tabelle von Jan. - Dez., mit einem dazugehörigen Wert.
Wenn der Wert 0 ist, dann soll die Farbe des Diagrammbalkens grün sein.
Ist der Wert einer Zelle größer 0, dann soll der dazugehörige Balken des Digramms rot sein.

Wie gesagt, ich versuchte das genau wie bei dem Kreisdiagramm anzuwenden, nur das der Rangebereich jetzt größer ist (mehrere Zellen, statt einer).

Wenn ich das Makro starte, kommt der Fehler 13 (Typen unverträglich) und bleibt an der Stelle mit dem fett gedruckten stehen.

ActiveChart.SeriesCollection(1).Points(1).Select
Select Case Range("C8:N8")
    Case Is = 0: Pts(1).Format.Fill.ForeColor.RGB = RGB(0, 176, 80) 'grün
    Case Else: Pts(1).Format.Fill.ForeColor.RGB = RGB(255, 0, 0) 'rot
End Select


OK, hier passt wohl der Rangebereich irgendwie nicht.

Ändere ich Rangebereich auf eine Zelle, dann kommt der Laufzeitfehler 91 (Objektvariable oder With-Blockvariable nicht festgelegt).

ActiveChart.SeriesCollection(1).Points(1).Select
Select Case Range("C8")
    Case Is = 0: Pts(1).Format.Fill.ForeColor.RGB = RGB(0, 176, 80) 'grün
    Case Else: Pts(1).Format.Fill.ForeColor.RGB = RGB(255, 0, 0) 'rot
End Select


Anbei meine Übungsdatei.
Wäre nett, wenn mir jemand helfen könnte.

Danke

Gruß Björn


Angehängte Dateien
.xlsm   Test.xlsm (Größe: 20,24 KB / Downloads: 5)
Antworten Top
#2
Hallöchen,

mal eine erste Frage - warum nimmst Du nicht zwei Datenreihen? Du kannst auch per Formel die Daten je nach Wert in zwei Spalten aufteilen und daraus ganz ohne Makro für die Farben sorgen.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#3
Hallo Björn,

1. In der  Testdatei ist kein Balkendiagramm.

2. Ich würde die Balken einfach rot mache, da man das grün bei Balken mit dem Wert 0 nicht sehen würde. Blush
helmut

Für mich ist die Möglichkeit in Excel an Zellen und Bereichen Namen zu vergeben die wichtigste Funktionalität.
Sie macht Formeln und den VBA-code verständlicher. Für Makros gilt die Regel: "Nur über benannte Bereiche auf den Inhalt der Zellen zugreifen."
Und wofür sind Regeln da? Um nachzudenken bevor man sie bricht.





Antworten Top
#4
Hallo Björn,

warum willst du im Programm denn die Zelle über die Adresse ansprechen? Das sollte man möglichst vermeiden. Was passiert wenn man im Blatt vor der Zelle Zeilen oder Spalten einfügt oder löscht?

In der Anlage ein Beispiel wo die Punkte abhängig von den Werten eingefärbt werden. Und hier das Makro:
Code:
Private Sub cbTest_Click()
Dim Werte As Variant
    With Me.ChartObjects("Diagramm 1").Chart.SeriesCollection(1)
        Werte = .Values
        For I = 1 To UBound(Werte)
         Select Case Werte(I)
            Case Is < 1: .Points(I).Format.Fill.ForeColor.RGB = RGB(0, 176, 80) 'grün
            Case Is < 5: .Points(I).Format.Fill.ForeColor.RGB = RGB(255, 192, 0) 'orange
            Case Else: .Points(I).Format.Fill.ForeColor.RGB = RGB(255, 0, 0) 'rot
        End Select
        Next I
    End With
End Sub

ps. Du solltest dir angewöhnen den Diagrammen und anderen Objekten eigene Namen zu geben und aus den Makros auf Zellen nur über benannte Zellen oder benannte Bereiche zuzugreifen. siehe Signatur


Angehängte Dateien
.xlsm   BalkendiagrammPunkteFarbe.xlsm (Größe: 24,64 KB / Downloads: 3)
helmut

Für mich ist die Möglichkeit in Excel an Zellen und Bereichen Namen zu vergeben die wichtigste Funktionalität.
Sie macht Formeln und den VBA-code verständlicher. Für Makros gilt die Regel: "Nur über benannte Bereiche auf den Inhalt der Zellen zugreifen."
Und wofür sind Regeln da? Um nachzudenken bevor man sie bricht.





Antworten Top
#5
Hallo Björn, 19 

nachfolgend deine Übungsdatei zurück: 21

.xlsb   Diagramm_Chart_erstellen_Farbe_zuweisen_CEF.xlsb (Größe: 22,23 KB / Downloads: 6)
________
Servus
Case
Antworten Top
#6
(24.09.2022, 22:03)Case schrieb: Hallo Björn, 19 

nachfolgend deine Übungsdatei zurück: 21

Moin Case,
vorab danke und es ist wirklich eine Übung oder Muster
Mein eigentliches Ziel, Ringdiagramme zu färben, konnte umgesetzt werden, Balkendiagramme werden aber auch immer gerne gesehen :)

Natürlich habe ich nur die Hälfte Deines Codes verstanden :)

Wärst Du so nett, Deinen Code für mich etwas zu erläutern, damit ich den besser nachvollziehen kann.
Die Nummer der Farbe Grün, ist mir unbekannt. Woher stammt die?
Und woher weiß der Code, auf welche Datenreihen er zurückgreifen muss?
Danke!

Public Sub Main()
    Dim varArr As Variant
    Dim lngPoint As Long
    On Error Resume Next
    Tabelle1.ChartObjects("TestN").Delete
    On Error GoTo Fin
    With Tabelle1.Shapes.AddChart2(286, 55, 300, 300, 600, 300).Chart
        .SetSourceData Source:=Range("Diagramm")
        .Parent.Name = "TestN"
        .Parent.Top = .Parent.Parent.Cells(12, 3).Top
        .Parent.Left = .Parent.Parent.Cells(12, 3).Left
        .Axes(xlValue).MaximumScale = 10
        .ChartTitle.Text = "TestCHART"
        With .Axes(xlValue)
            .HasTitle = True
            With .AxisTitle
                .Caption = "Anzahl Test"
                .Font.Name = "bookman"
                .Font.Size = 10
                .Characters(10, 8).Font.Italic = True
            End With
        End With
    End With
   
    With ActiveSheet.ChartObjects("TestN").Chart.SeriesCollection(1)
        varArr = .Values
        For lngPoint = 1 To .Points.Count
            Select Case varArr(lngPoint)
                Case 0
                    .Points(lngPoint).Interior.Color = 5287936  ???
                Case Is > 0
                    .Points(lngPoint).Interior.Color = 255
            End Select
        Next lngPoint
    End With
Fin:
    If Err.Number <> 0 Then MsgBox "Error: " & Err.Number & " " & Err.Description
End Sub

(24.09.2022, 19:59)Ego schrieb: Hallo Björn,

1. In der  Testdatei ist kein Balkendiagramm.

2. Ich würde die Balken einfach rot mache, da man das grün bei Balken mit dem Wert 0 nicht sehen würde. Blush

Moin, doch bei 3D-Balkendigrammen.

(24.09.2022, 18:31)schauan schrieb: Hallöchen,

mal eine erste Frage - warum nimmst Du nicht zwei Datenreihen? Du kannst auch per Formel die Daten je nach Wert in zwei Spalten aufteilen und daraus ganz ohne Makro für die Farben sorgen.

Moin schauan,
falls Du das hier meinst ...

https://www.youtube.com/watch?v=em3lrqBKMV0

das habe ich bereitds ausprobiert.

(24.09.2022, 21:35)Ego schrieb: Hallo Björn,

warum willst du im Programm denn die Zelle über die Adresse ansprechen? Das sollte man möglichst vermeiden. Was passiert wenn man im Blatt vor der Zelle Zeilen oder Spalten einfügt oder löscht?

In der Anlage ein Beispiel wo die Punkte abhängig von den Werten eingefärbt werden. Und hier das Makro:
Code:
Private Sub cbTest_Click()
Dim Werte As Variant
    With Me.ChartObjects("Diagramm 1").Chart.SeriesCollection(1)
        Werte = .Values
        For I = 1 To UBound(Werte)
         Select Case Werte(I)
            Case Is < 1: .Points(I).Format.Fill.ForeColor.RGB = RGB(0, 176, 80) 'grün
            Case Is < 5: .Points(I).Format.Fill.ForeColor.RGB = RGB(255, 192, 0) 'orange
            Case Else: .Points(I).Format.Fill.ForeColor.RGB = RGB(255, 0, 0) 'rot
        End Select
        Next I
    End With
End Sub

ps. Du solltest dir angewöhnen den Diagrammen und anderen Objekten eigene Namen zu geben und aus den Makros auf Zellen nur über benannte Zellen oder benannte Bereiche zuzugreifen. siehe Signatur

Moin Ego,
danke für Deinen Code, funktioniert super.
Antworten Top
#7
Hallöchen,

dann sollte es ja auch ohne code passen Smile
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#8
Hallo Björn, 19 

hier die Datei mit kommentiertem Code: 21 

.xlsb   Diagramm_Chart_erstellen_Farbe_zuweisen_1_CEF.xlsb (Größe: 24,43 KB / Downloads: 2)

Farbe wird auch in der Datei gezeigt.

Die Farbe bekommst du auch folgendermaßen raus. Färbe eine Zelle mit Farbe. Setze den Cursor in die Zelle. Gehe in den VBA-Editor. Im Direktbereich (STRG+G) gibst du folgendes ein "?Activecell.Interior.Color" - mit Fragezeichen am Anfang. Der entsprechende Wert wird ausgegeben.
________
Servus
Case
Antworten Top
#9
(26.09.2022, 14:43)schauan schrieb: Hallöchen,

dann sollte es ja auch ohne code passen Smile

Moin, ja das geht auch ohne Code.
Danke!

(26.09.2022, 15:23)Case schrieb: Hallo Björn, 19 

hier die Datei mit kommentiertem Code: 21 


Farbe wird auch in der Datei gezeigt.

Die Farbe bekommst du auch folgendermaßen raus. Färbe eine Zelle mit Farbe. Setze den Cursor in die Zelle. Gehe in den VBA-Editor. Im Direktbereich (STRG+G) gibst du folgendes ein "?Activecell.Interior.Color" - mit Fragezeichen am Anfang. Der entsprechende Wert wird ausgegeben.

Hallo Case,
dass mit der Farbe kannte ich nicht, super Hinweis, danke.
Natürlich danke ich Dir auch für den kommentierten Code.

Eines verstehe ich dennoch (auch mithilfe Deiner Links) nicht.

Wenn ich es richtig verstanden habe, dann würde "SeriesCollection()" ohne Index die gesamte Tabelle Durchsuchen.
Jetzt mein Verständnisproblem.
Woher weiß "SeriesCollection(1)", dass es sich um die Range "C8-N8" handelt. Dies ist für mich nicht nachvollziehbar.
Es liegt nicht daran, dass es die einzigen Werte in der Tabelle sind, das habe ich ausprobiert.
Antworten Top
#10
Hallöchen,

der SeriesCollection ist der Bereich egal, es geht um die Reihenfolge der Datenreihen im Diagramm.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste