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.
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)
2. Ich würde die Balken einfach rot mache, da man das grün bei Balken mit dem Wert 0 nicht sehen würde.
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.
24.09.2022, 22:35 (Dieser Beitrag wurde zuletzt bearbeitet: 24.09.2022, 22:43 von Ego.)
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
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.
26.09.2022, 15:31 (Dieser Beitrag wurde zuletzt bearbeitet: 26.09.2022, 15:36 von Björn.412.)
(24.09.2022, 23:03)Case schrieb: Hallo Björn,
nachfolgend deine Übungsdatei zurück:
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, 20: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.
Moin, doch bei 3D-Balkendigrammen.
(24.09.2022, 19: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.
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.
hier die Datei mit kommentiertem Code: [attachment=45205]
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.
01.10.2022, 16:30 (Dieser Beitrag wurde zuletzt bearbeitet: 01.10.2022, 16:53 von Björn.412.)
(26.09.2022, 15:43)schauan schrieb: Hallöchen,
dann sollte es ja auch ohne code passen
Moin, ja das geht auch ohne Code. Danke!
(26.09.2022, 16:23)Case schrieb: Hallo Björn,
hier die Datei mit kommentiertem Code:
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.