Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Chart unter VBA

Forumthread: Chart unter VBA

Chart unter VBA
TommiH
Moin,
hm, und noch eine Frage, ich würde gerne aus den Spalten A6-A11 (Betextung) und D6-D11 (Werte) einen ganz normalen Balkenchart generieren, horizontal ausgerichtet, mit den Werten am Ende eines jeden Balkens, eigentlich gerne die Cylinder-Balken - und das Ganze ohne Legende.
Da ich mich mit Charts noch sehr wenig auskenne (unter VBA fast noch gar nicht) dachte ich ich nehme den Makro-Recorder, aber der zeichnet DAS auf - und wenn ich das einbinde dann kommt nur ein
'Anwendungs oder objektorientierter Fehler'
Kann mir da jemand einen Tip geben, wie ich den Makro-Recorder-Code lauffähig bekomme?
Tommi

Range("A6:A11,D6:D11").Select
Range("D6").Activate
ActiveSheet.Shapes.AddChart.Select
ActiveChart.SetSourceData Source:=Range( _
"'EP-Auswertung'!$A$6:$A$11;'EP-Auswertung'!$D$6:$D$11")
ActiveChart.ChartType = xlCylinderBarClustered
ActiveChart.Legend.Select
Selection.Delete
ActiveSheet.ChartObjects("Diagramm 2").Activate
ActiveChart.SeriesCollection(1).Select
ActiveSheet.ChartObjects("Diagramm 2").Activate
ActiveSheet.ChartObjects("Diagramm 2").Activate
ActiveChart.SeriesCollection(1).ApplyDataLabels
ActiveSheet.ChartObjects("Diagramm 2").Activate
ActiveChart.SeriesCollection(1).DataLabels.Select

Anzeige
AW: Chart unter VBA
05.09.2011 16:02:02
Beverly
Hi Tommi,
meinst du das so:

Sub DiaErstellen()
With ActiveSheet.Shapes.AddChart.Chart
.ChartType = xlCylinderBarClustered
.SetSourceData Source:=Range("'EP-Auswertung'!$A$6:$A$11,'EP-Auswertung'!$D$6:$D$11")
.ApplyDataLabels
End With
End Sub



Anzeige
AW: Chart unter VBA
05.09.2011 16:40:09
TommiH
Hallo Karin,
oh, das ist schon viel besser ;) - danke! - also mein Chart habe ich nun, die Legende habe ich auch noch mit .Legend.Delete entfernen können.
Nun fehlen mir eigentlich nur noch 4 Dinge ;)
- Chart ca. (linke obere Ecke) auf A15
- 3d-Drehung weg
- Füllfarbe anders
- Kann man die Werte sortieren, ohne das man die Original-Werte 'umbauen' muss?
und als wichtigste Frage (Hilfe zur Selbsthilfe) - wo finde ich die verflixten Chartfunktionen ;) - irgendwie finde ich mit charts in der Excel-Hilfe nicht wirklich viel - gibt es irgendwo eine Liste, welche Befehle was sind? Mit dem Makkrorecorder komme ich da anscheinend leider nicht dran :(
Hast du da 'nen Tip?
Tommi
Anzeige
AW: Chart unter VBA
05.09.2011 18:39:58
Beverly
Hi Tommi,
ich nehme an, du meinst das so:

Sub DiaErstellen()
With ActiveSheet.Shapes.AddChart.Chart
.SetSourceData Source:=Range("'EP-Auswertung'!$A$6:$A$11,'EP-Auswertung'!$D$6:$D$11")
.SetElement (msoElementLegendNone)
.ChartType = xlCylinderBarClustered
.ApplyDataLabels
.Rotation = 0
.SeriesCollection(1).Interior.ColorIndex = 4 ' Farbe anpassen
.Axes(xlCategory).ReversePlotOrder = True
.Axes(xlCategory).Crosses = xlMaximum
.Parent.Top = Range("A15").Top
.Parent.Left = Range("A15").Left
End With
End Sub

Zu deiner Frage bezüglich Chart und VBA: Excel2007 zeichnet leider keinen Code für Charts und Shapes auf - das ist erst ab Version 2010 wieder möglich. Falls du noch eine Version vor 2007 hast, kannst du diese verwenden, denn 99% des damit aufgezeichneten Codes funktionert auch noch in den höheren Versionen. Allerdings gibt es ab Excel2007 eine ganze Reihe von Formatierungsmöglichkeiten mehr, sodass einem dann nur übrig bleibt, sich durch die Excel-Hilfe "durchzuwursteln", oder man setzt im VBA-Editor eine Überwachung und lässt sich die entsprechenden Eigenschaften im Überwachungsfenster anzeigen.


Anzeige
AW: Chart unter VBA
06.09.2011 10:06:34
TommiH
Hallo Karin,
erstmal herzlichen Dank für die super Hilfe!
Also - der Code funktioniert wunderbar - Farbe habe ich angepasst.
Interessant finde ich, das es anscheinend mehrere Möglichkeiten gibt, das Ziel zu erreichen ;)
.SetElement (msoElementLegendNone)
.Legend.Delete
Das funktioniert beides...
Ich habe nun auch in der Hilfe Chart-Objektmember und Eigenschaften gefunden, hm, aber nichts zu einer Größenänderung, die fehlt mir nun nur noch zu meinem Glück...
Irgendwie fehlt schon eine gescheite Hilfe (in Excel) die übersichtlich die Funktionen/Variablen eines Charts darstellt...
Oh - und noch etwas, neben der Größe, die Quell-Definition sieht ja im Moment so aus.
.SetSourceData Source:=Range("'Tab'!$A$6:$A$11,'Tab'!$D$6:$D$11")
Der Haken - das ist schwer in eine Schleife (es gibt dutzende von Charts) zu packen. Geht das von der Definition nicht auch irgendwie im Stil von:
.SetSourceData Source:=Range("'Tab'!" & Range(Cells(6, 1), Cells(11, 1)) & ",'Tab', " & Range(Cells(6, 4), Cells(11, 4)))
Also das man es mit Variablen ansprechen kann?
Tommi
Anzeige
AW: Chart unter VBA
06.09.2011 10:43:08
Beverly
Hi Tommy,
mit den beiden Codezeilen

      .Parent.Top = Range("A15").Top
.Parent.Left = Range("A15").Left

wird die Position der linken oberen Ecke festgelegt - nach dem selben Prinzip kann man auch die Größe definieren

      .Parent.Height = Range("A15:D20").Height    ' Höhe
.Parent.Left = Range("A15:D20").Width    ' Breite

Anstelle eines Zellbereichs kann man auch direkt Zahlen verwenden.
Die Definition des Wertebereichs des Diagramms lässt sich natürlich auch mit Variablen realisieren. Das WIE hängt aber davon ab, was genau in deinen Zellen steht.


Anzeige
AW: Chart unter VBA
06.09.2011 10:56:56
TommiH
Hallo Karin,
perfekt, damit passt nun auch die Größe - so, nun also ans letzte Problem ;)
Ich habe ein Excel-Sheet mit mehreren 1.000 Zeilen. Alle 150 Zeilen soll ein Chart eingefügt werden, ich habe also eine Schleife die von 1-75000 durchläuft und alle 150 Zeilen soll der Bereich
Beschreibung : Range(Cells(zeile,1),Cells(zeile+8,1))
Werte : Range(Cells(zeile,4),Cells(zeile+8,4))
dargestellt werden.

zeile = 1
For Gzeile=1 to 7500
zeile = zeile +1
If zeile=150 Then
zeile = 1
Endif
(programmcode)
(modifikationen)
If zeile=1 Then
(Chart)
Endif
Next
Ist das verständlich? Ich modifiziere/ergänze halt rund 140 Zeilen lang und dann soll ein Chart eingebaut werden - also immer wenn ich in (quasi) Zeile 1 bin, dann will ich da einen Chart einfügen, also in Zeile 1, 151, 301, 451 usw.
Tommi
Anzeige
AW: Chart unter VBA
06.09.2011 11:58:28
Beverly
Hi Tommi,
eine hochgeladene Beispieldatei wäre da sehr hilfreich.


AW: Chart unter VBA
06.09.2011 12:30:28
TommiH
Hallo Karin,
kann ich machen, ich bin allerdings schon deutlich weiter ;)
Ich habe deine Codezeile
.SetSourceData Source:=Range("'Tab'!$A$6:$A$11,'Tab'!$D$6:$D$11")
umgebaut in
q=14
.SetSourceData Source:=Range("'Tab'!$A$" & q - 8 & ":$A$" & q - 3 & ",Tab'!$D$" & q - 8 & ":$D$" & q - 3)
Damit kann ich die Position in Abhängigkeit von der Variablen q ansteuern.
ABER - das erzeugt bei mir unterschiedliche Charts - also optisch/vom Layout...
Wie kann soetwas sein?
Tommi
Anzeige
AW: Chart unter VBA
06.09.2011 12:47:31
TommiH
Hallo Karin,
wirklich verwirrend, wenn ich deine Codezeile nehme, dann wird
Userbild
erstellt. Nehme ich meine Zeile, dann wird
Userbild
erstellt. Das verstehe ich nicht. Dabei habe ich doch nur die Zahlen durch eine Variable ersetzt...
Tommi
Anzeige
AW: Chart unter VBA
06.09.2011 12:54:44
Beverly
Hi Tommi,
der Inhalt meines letzten Beitrages gilt nach wie vor.


AW: Chart unter VBA
06.09.2011 12:58:20
TommiH
Hm,
du meinst das Hochladen? ;) - was denn genau - beide Dateien, also Programmcode + Excel-Datei oder meinst du nur den Programmcode?
Der Haken ist, das ich die ExcelDatei schlecht hochladen kann, weil die das Hochladevolumen locker sprengen würde... Da müsste ich erstmal kürzen...
Tommi
Anzeige
AW: Chart unter VBA
06.09.2011 14:52:13
Beverly
Hi Tommi,
1. was nützt mir dein Programmcode alleine und 2. ist der Programmcode doch in der Excel-Datei enthalten - oder sehe ich das falsch?
Zum Testen ist nicht die komplette Arbeitsmappe erforderlich, es reichen so viele Daten, dass 2 - 3 Diagrmme erstellt werden können.


Anzeige
AW: Chart unter VBA
06.09.2011 15:50:51
TommiH
Hallo Karin,
naja, direkte Fehler im Code kann ich z.B. schon erkennen, wenn ich mich mit einer Progammiersprache gut auskenne ;) - und nein der Code ist nich in der Excel-Datei enthalten, sondern in meiner personl.xls - ist aber natürlich kein Problem ihn in die ExcelDatei reinzupacken.
Wenn du magst kann ich die Datei gerne hochladen (ExcelDummy+VBA-Script) allerdings hat sich von meiner Seite das Problem inzwischen erledigt, ich weiss nicht wieso, aber in einem Testlauf habe ich mein Konstrukt vor deinem gehabt und er hat damit 2x die Befehlszeile ausgeführt
v1 = "'Tab'!$A$" & q - 8 & ":$A$" & q - 3 & ",'Tab'!$D$" & q - 8 & ":$D$" & q - 3
.SetSourceData Source:=Range(v1)
.SetSourceData Source:=Range(v1)
Und - danach ist das Ergebnis einwandfrei - wenn ich nur einmal .SetSourceData nehme, dann sieht es aus wie in den beiden Grafiken - es macht auf mich den Eindruck, das mit der Zeile .SetSourceData irgendetwas initialisiert wird, und erst im zweiten Anlauf das gewünschte Ergebnis kommt, warum auch immer...
Tommi
In Zeile 210 ist der Teil des Charts welcher so eigenartig ist...
https://www.herber.de/bbs/user/76488.xls
Anzeige
AW: Chart unter VBA
06.09.2011 16:50:15
Beverly
Hi Tommi,

naja, direkte Fehler im Code kann ich z.B. schon erkennen, wenn ich mich mit einer Progammiersprache gut auskenne ;)

Dann solltest du auch selbst erkennen können, was an deinem Code falsch ist.


Anzeige
AW: Chart unter VBA
06.09.2011 16:59:05
TommiH
Hallo Karin,
nicht wirklich (VBA bescheiden) - wenn ich mich mit VBA gut auskennen würde, dann würed ich hier ja nicht fragen, sondern eher vermehrt antworten ;)
Und wie gesagt, wenn ich die Zeile 2x ausführe, dann klappt alles wie gewünscht - wo auch immer da der Fehler zu suchen ist...
Tommi
Anzeige
AW: Chart unter VBA
09.09.2011 09:35:39
TommiH
Okay,
dann lasse ich es einfach so, wie gesagt, es funktioniert so ja bestens, auch wenn ich das mit der doppelten Zeile nicht verstehe ;)
Danke auf alle Fälle für die super Hilfe, dann kann ich da mal noch etwas weiter rumexperimentieren, die Pflicht ist damit geschafft, der Rest ist dann eh nur noch 'Kür' ;)
Tommi
Anzeige
AW: Chart unter VBA
06.09.2011 12:56:48
TommiH
Jetzt bin ich völlig verwirrt, ich habe mir den Ausdruck mal in einer Variablen zwischengespeichert und den generierten mit deinem verglichen - die sind identisch! Und trotzdem kommen unterschiedliche Ergebnisse dabei raus?

v1 = "'Tab'!$A$" & q - 8 & ":$A$" & q - 3 & ",'Tab'!$D$" & q - 8 & ":$D$" & q - 3
.SetSourceData Source:=Range(v1)
' - Ausdruck der beim VBA-Programmlauf  in v1 entsteht
'                          -  "'Tab'!$A$6:$A$11,'Tab'!$D$6:$D$11"
.SetSourceData Source:=Range("'Tab'!$A$6:$A$11,'Tab'!$D$6:$D$11")
Die Codestücke sind wirklich identisch - da bin ich mit meinem Latein am Ende.
Tommi
Anzeige
AW: Chart unter VBA
06.09.2011 11:29:16
TommiH
Hm,
(Werte) also mit
.SetSourceData Source:=Range(Range(Cells(6, 1), Cells(11, 1)), Range(Cells(6, 4), Cells(11, 4)))
kann ich zwar die Range mit Zahlen/Variablen angeben, allerdings bekomme ich dann komischerweise bei der Achsenskalierung Probleme (ich habe da nicht mehr 1-100 sondern %-Werte stehen?!?
Und bei der Größenangabe des Charts bin ich nun doch etwas verwirrt...
.Parent.Height = Range("A15:D20").Height ' Höhe
.Parent.Left = Range("A15:D20").Width ' Breite
A15:D20 - ist doch ein Bereich - (linke obere - rechte untere Ecke) - ist das wirklich richtig, schließlich möchte ich ja nur die Höhe darstellen (also 15-20) - ebenso bei Breite...
Ah - ich glaube nun habe ich es - mit
.Parent.Height = 50
.Parent.Width = 200
geht es wie gewünscht ;)
Fein also auch erledigt, bleibt nur noch die Postionierung mit den Variablen (x/y)
Tommi
Anzeige
AW: Chart unter VBA
06.09.2011 11:49:02
TommiH
Oh, und für die Position kann man also auch einfach
.Parent.Top = Rows(15).Top
.Parent.Left = Columns(1).Left
schreiben, das ist (für den VariablenEinsatz) natürlich auch sehr praktisch - fehlt also nur noch die Herkunfts-Daten-Definition...
Tommi
;
Anzeige

Infobox / Tutorial

Diagramme mit VBA in Excel erstellen


Schritt-für-Schritt-Anleitung

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu starten.

  2. Erstelle ein neues Modul:

    • Klicke im Menü auf Einfügen > Modul.
  3. Füge den folgenden Code ein, um ein einfaches Balkendiagramm zu erstellen:

    Sub DiaErstellen()
        With ActiveSheet.Shapes.AddChart.Chart
            .ChartType = xlCylinderBarClustered
            .SetSourceData Source:=Range("'EP-Auswertung'!$A$6:$A$11,'EP-Auswertung'!$D$6:$D$11")
            .ApplyDataLabels
            .SetElement (msoElementLegendNone) ' Entfernt die Legende
        End With
    End Sub
  4. Schließe den VBA-Editor und gehe zurück zu Excel.

  5. Führe das Makro aus:

    • Drücke ALT + F8, wähle DiaErstellen und klicke auf Ausführen.

Häufige Fehler und Lösungen

  • Fehler: Anwendungs- oder objektorientierter Fehler
    Lösung: Überprüfe den Zellbereich in SetSourceData, um sicherzustellen, dass die Referenzen korrekt sind.

  • Diagramm wird nicht angezeigt oder ist leer.
    Lösung: Stelle sicher, dass der angegebene Datenbereich tatsächlich Werte enthält.


Alternative Methoden

Es gibt auch andere Möglichkeiten, um Diagramme in Excel mit VBA zu erstellen. Eine davon ist die Verwendung von benannten Bereichen oder Variablen zur dynamischen Definition des Datenbereichs:

Dim q As Integer
q = 14
With ActiveSheet.Shapes.AddChart.Chart
    .SetSourceData Source:=Range("'Tab'!$A$" & q - 8 & ":$A$" & q - 3 & ",'Tab'!$D$" & q - 8 & ":$D$" & q - 3)
End With

Praktische Beispiele

Hier sind einige praktische Beispiele zur Verwendung von addchart in VBA:

  1. Diagramm ohne Legende und mit angepasster Farbe:

    Sub ErstelleDiagramm()
        With ActiveSheet.Shapes.AddChart.Chart
            .ChartType = xlCylinderBarClustered
            .SetSourceData Source:=Range("A6:D11")
            .SeriesCollection(1).Interior.ColorIndex = 4 ' Farbe anpassen
            .SetElement (msoElementLegendNone)
        End With
    End Sub
  2. Diagramm an einer spezifischen Position platzieren:

    Sub PositioniereDiagramm()
        Dim chartObj As ChartObject
        Set chartObj = ActiveSheet.ChartObjects.Add(Left:=100, Width:=375, Top:=50, Height:=225)
        With chartObj.Chart
            .SetSourceData Source:=Range("A6:D11")
            .ChartType = xlCylinderBarClustered
        End With
    End Sub

Tipps für Profis

  • Verwende ActiveChart oder ActiveSheet.ChartObjects für mehr Flexibilität beim Arbeiten mit mehreren Diagrammen.
  • Nutze .Rotation und .Interior.Color für erweiterte Diagrammformatierungen.
  • Experimentiere mit der SetSourceData Methode in Schleifen, um mehrere Diagramme effizient zu erstellen.

FAQ: Häufige Fragen

1. Wie kann ich die Datenquelle eines bereits bestehenden Diagramms ändern?
Du kannst die SetSourceData Methode aufrufen, um die Datenquelle dynamisch zu ändern:

ActiveChart.SetSourceData Source:=Range("A1:B10")

2. Warum werden meine Diagramme unterschiedlich dargestellt, obwohl der Code identisch ist?
Versionsunterschiede in Excel können zu variierenden Darstellungen führen. Stelle sicher, dass alle Formatierungen und Eigenschaften konsistent gesetzt sind.

3. Gibt es eine Möglichkeit, Diagramme in einer Schleife zu erstellen?
Ja, du kannst eine For-Schleife verwenden, um mehrere Diagramme in einem Rutsch zu erstellen. Achte darauf, die Indizes für die Datenquellen korrekt zu setzen.

For i = 1 To 10
    ' Diagramm erstellen
Next i

4. Wie kann ich die Größe eines Diagramms anpassen?
Du kannst die Eigenschaften .Height und .Width des Diagramms verwenden, um die Größe festzulegen:

With ActiveChart
    .Parent.Height = 300
    .Parent.Width = 500
End With

5. Wie kann ich die Achsenskalierung ändern?
Du kannst die Eigenschaften der Achsen anpassen, um die Skalierung zu ändern:

With ActiveChart.Axes(xlValue)
    .MinimumScale = 0
    .MaximumScale = 100
End With

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige