Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA: Diagramm mit Datumsachse dynamisch erstellen

Forumthread: VBA: Diagramm mit Datumsachse dynamisch erstellen

VBA: Diagramm mit Datumsachse dynamisch erstellen
23.08.2016 14:48:13
Jessi
Hallo zusammen,
für eine Auswertung möchte ich ein Diagramm in Excel 2013 erstellen, welches automatisch über ein Makro ergänzt bzw. aktualisiert werden kann. Das heißt mein Diagramm soll dynamisch wachsen können, indem nach und nach immer mehr Arbeitsblätter hinzugefügt und ausgelesen werden.
Dazu habe ich bereits einige Auswertungsbögen in Excel importiert, sodass die notwendigen Informationen zwar in unterschiedlichen Blättern aber immer in der gleichen Zelle stehen (in meinem Fall C5).
Auf der x-Achse meines Diagramms soll das Datum stehen, welches der Name der einzelnen Arbeitsblätter ist und über eine Schleife ausgelesen und in einem anderen Arbeitsblatt „Hilfswerte“ gespeichert wird (der Abstand zwischen den Daten soll genormt sein). Auf der y- Achse sollen Noten (von 1-4) stehen.
Die Datenreihe besteht dann aus den vergebenen Noten, welche auf den Auswertungsbögen bzw. in den Arbeitsblättern in Zelle C5 zu finden sind.
Gesammelt werden die Noten der Auswertungsbögen ebenfalls in dem Arbeitsblatt „Hilfswerte“ (Durch eine Schleife die alle Arbeitsblätter abläuft, die Zelle C5 kopiert und im Arbeitsblatt „Hilfswerte“ wieder abspeichert). Mit Hilfe dieser Werte möchte ich in einem anderen Arbeitsblatt „Uebersicht“ das oben beschriebene Diagramm erstellen.
Allerdings funktioniert die Darstellung des Datums auf der x- Achse, sowie die Darstellung der Datenreihe nicht. Es wird der Laufzeitfehler „1004“: ungültiger Parameter ausgeworfen.
Anbei mein Code, hat vielleicht jemand eine Idee woran das liegen könnte?
Danke schon jetzt für eure Hilfe 
Modul 1:
Sub Diagramm_erstellen()
' vorhandene Diagramme löschen:
Dim anzahlDia As Long
With ActiveSheet
If .ChartObjects.count  0 Then
For anzahlDia = .ChartObjects.count To 1 Step -1
.ChartObjects(anzahlDia).Delete
Next anzahlDia
End If
End With
' Diagramm erstellen
Sheets("Uebersicht").Shapes.AddChart.Select
ActiveChart.ChartType = xlXYScatterLines
'Position und Größe festlegen
With ActiveChart.Parent
.Left = 90
.Top = 90
.Width = 500
.Height = 300
End With
'Diagramm Umrandung
With Selection.Format.Line
.Visible = msoTrue
.Weight = 4
End With
'Beschriftung Diagramm
With ActiveChart
.HasTitle = True
.ChartTitle.Text = "mittlere Bewertung"
'Beschriftung Achsen
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Datum"
.Axes(xlValue, xlPrimary).HasTitle = True
.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Note"
End With
'Ruft Methode auf, um Werte aus Reiter auszulesen
Call WorksheetLoop
' Werte der x-Achse
With ActiveChart
.HasAxis(xlCategory, xlPrimary) = True
.Axes(xlCategory).TickLabels.Orientation = 45
.Axes(xlCategory).Select
Selection.TickLabels.NumberFormat = "TT.MM.JJJJ"
.SeriesCollection(1).XValues = "='Hilfswerte'!$A$1:$A$4" 'Hier wird der Fehler geworfen
.Axes(xlCategory).MinorUnit = 1
End With
'Werte der y-Achse
With ActiveChart.Axes(xlValue)
.MaximumScale = 4
.MinimumScale = 0
.MinorUnit = 1
.MajorUnitIsAuto = True
End With
' Gitternetzlinien zufügen:
With ActiveChart.Axes(xlCategory)
.HasMajorGridlines = True
.HasMinorGridlines = False
End With
With ActiveChart.Axes(xlValue)
.HasMajorGridlines = True
.HasMinorGridlines = False
End With
'Daten in Diagramm einfügen'
ActiveChart.FullSeriesCollection.name = "=""Durchschnittsnote"""
ActiveChart.FullSeriesCollection.Values = "='Hilfswerte'!$C$1:$C$4"
End Sub

Modul 2: (funktioniert fehlerfrei)
'Methode, um das Datum aus Reitername, sowie die Mittlere Bewertung auszulesen und in Arbeitsblatt "Hilfswerte" zwischen zu speichern

Sub WorksheetLoop()
Dim WS_Count As Integer
' I gibt die Nummer des Arbeitsblattes an
Dim I As Integer
' L gibt die Spaltennummer des Datenblatts "Hilfswerte" an.
Dim L As Integer
Dim name As String
Dim note As String
' WS_Count ist gleich der Nummer der Arbeitsblätter in der activen Arbeitsmappe.
WS_Count = ActiveWorkbook.Worksheets.count
L = 1
For I = 3 To WS_Count
name = ActiveWorkbook.Worksheets(I).name
Sheets("Hilfswerte").Range("A" & L).value = name
note = ActiveWorkbook.Worksheets(I).Range("C5")
ActiveWorkbook.Worksheets("Hilfswerte").Range("C" & L).value = note
L = L + 1
Next I
End Sub

Anzeige

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA: Diagramm mit Datumsachse dynamisch erstellen
23.08.2016 15:44:54
ChrisL
Hi Jessi
Vielleicht noch nicht abschliessend, aber ich denke es gibt u.a. folgende Probleme.
Bevor du eine SeriesCollection ansprechen kannst, musst du sie erstellen.
.SeriesCollection.NewSeries
Ausserdem handelt es sich beim Tabellennamen um einen Text-String. Diesen müsstest du zuerst in ein richtiges Datum umwandeln:
Sheets("Hilfswerte").Range("A" & L).value = CDate(name)
N.b. eine Variable "name" zu nennen ist nicht sinnvoll, da VBA diesen Begriff ebenfalls verwendet. Ist zwar nochmals gut gegangen, aber z.B. "TBName" als Variable wäre unproblematisch.
NumberFormat = "TT.MM.JJJJ"
In VBA müsstest du englisch schreiben...
NumberFormat = "DD.MM.YYYY"
cu
Chris
Anzeige
AW: ist "Datum" ein Text?
23.08.2016 15:53:24
Fennek
Hallo,
nach Lesen des Codes vermute ich, dass in A1:A4 ein Text und kein Datum steht.
Teste:

For I = 3 To WS_Count
name = ActiveWorkbook.Worksheets(I).name
Sheets("Hilfswerte").Range("A" & L).value = cdate(name) '
mfg
Tipp: alle Diagramme löschen
23.08.2016 20:03:40
Beverly
Hi,
mal nur als Hinweis am Rande: um alle Diagramme zu löschen bedarf es keiner Schleife - das lässt sich auf einen Ritt erledigen
    With ActiveSheet
If .ChartObjects.Count > 0 Then .ChartObjects.Delete
End With



Anzeige
AW: VBA: Diagramm mit Datumsachse dynamisch erstellen
24.08.2016 08:56:12
Jessi
Hallo :-)
Vielen Dank euch dreien für die schnelle Antwort. Ich habe eure Lösungsvorschläge gleich heute morgen ausporbiert und bin dadurch schon einen großen Schritt weiter gekommen.
Allerdings wird mir das Datum auf der x-Achse immer noch nicht richtig angezeigt. Es hat zwar das richtige Format aber die falschen Werte (Z.B statt wie im Arbeitsblatt "Hilfswerte" angegeben 24.05.2016 steht auf der x-Achse 10.04.JJJJ).
Außerdem ist die Datenreihe noch nicht richtig benannt und angezeigt wird sie auch noch nicht. Folglich muss noch irgendetwas beim Einlesen der Werte schief gehen.
Anbei noch mal mein überarbeiteter Code.
Habt ihr vllt noch eine Idee woran das liegen könnte?
Vielen Dank für eure Hilfe :-)
Modul 1:
Sub Diagramm_erstellen()
' vorhandene Diagramme löschen:
With ActiveSheet
If .ChartObjects.count > 0 Then .ChartObjects.Delete
End With
' Diagramm erstellen
Sheets("Uebersicht").Shapes.AddChart.Select
ActiveChart.ChartType = xlXYScatterLines
'Position und Größe festlegen
With ActiveChart.Parent
.Left = 90
.Top = 90
.Width = 500
.Height = 300
End With
'Diagramm Umrandung
With Selection.Format.Line
.Visible = msoTrue
.Weight = 4
End With
'Beschriftung Diagramm
With ActiveChart
.HasTitle = True
.ChartTitle.Text = "mittlere Bewertung"
'Beschriftung Achsen
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Datum"
.Axes(xlValue, xlPrimary).HasTitle = True
.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Note"
End With
'Ruft Methode auf, um Werte aus Reiter auszulesen
Call WorksheetLoop
' Werte der x-Achse
With ActiveChart
.HasAxis(xlCategory, xlPrimary) = True
.Axes(xlCategory).TickLabels.Orientation = 45
.Axes(xlCategory).Select
Selection.TickLabels.NumberFormat = "DD.MM.JJJJ"
.SeriesCollection.NewSeries
.SeriesCollection(1).XValues = "='Hilfswerte'!$A$1:$A$4" 'Hier wird der Fehler geworfen
.Axes(xlCategory).MinorUnit = 1
End With
'Werte der y-Achse
With ActiveChart.Axes(xlValue)
.MaximumScale = 4
.MinimumScale = 0
.MinorUnit = 1
.MajorUnitIsAuto = True
End With
' Gitternetzlinien zufügen:
With ActiveChart.Axes(xlCategory)
.HasMajorGridlines = True
.HasMinorGridlines = False
End With
With ActiveChart.Axes(xlValue)
.HasMajorGridlines = True
.HasMinorGridlines = False
End With
'Daten in Diagramm einfügen'
ActiveChart.FullSeriesCollection.name = "=""Durchschnittsnote"""
ActiveChart.FullSeriesCollection.Values = "='Hilfswerte'!$C$1:$C$4"
End Sub

Modul 2:
'Methode, um das Datum aus Reitername, sowie die Mittlere Bewertung auszulesen und in Arbeitsblatt "Hilfswerte" zwischen zu speichern

Sub WorksheetLoop()
Dim WS_Count As Integer
' I gibt die Nummer des Arbeitsblattes an
Dim I As Integer
' L gibt die Spaltennummer des Datenblatts "Hilfswerte" an.
Dim L As Integer
Dim name As String
Dim note As String
' WS_Count ist gleich der Nummer der Arbeitsblätter in der activen Arbeitsmappe.
WS_Count = ActiveWorkbook.Worksheets.count
L = 1
For I = 3 To WS_Count
name = ActiveWorkbook.Worksheets(I).name
Sheets("Hilfswerte").Range("A" & L).value = CDate(name)
note = ActiveWorkbook.Worksheets(I).Range("C5")
ActiveWorkbook.Worksheets("Hilfswerte").Range("C" & L).value = note
L = L + 1
Next I
End Sub

Anzeige
AW: VBA: Diagramm mit Datumsachse dynamisch erstellen
24.08.2016 09:41:54
ChrisL
Hi Jessi
YYYY nicht JJJJ
Zudem noch die Werte aus Spalte C zuweisen.
' Werte der x-Achse
With ActiveChart
.HasAxis(xlCategory, xlPrimary) = True
.Axes(xlCategory).TickLabels.Orientation = 45
.Axes(xlCategory).TickLabels.NumberFormat = "DD.MM.YYYY"
.SeriesCollection.NewSeries
.SeriesCollection(1).XValues = "='Hilfswerte'!$A$1:$A$4"
.SeriesCollection(1).Values = "='Hilfswerte'!$C$1:$C$4"
.Axes(xlCategory).MinorUnit = 1
End With

cu
Chris
Anzeige
AW: VBA: Diagramm mit Datumsachse dynamisch erstellen
24.08.2016 10:08:34
Jessi
Hey Chris,
super Danke für die schnelle Antwort.
Es funktioniert :-)
;
Anzeige
Anzeige

Infobox / Tutorial

Dynamisches Diagramm mit Datumsachse in Excel erstellen


Schritt-für-Schritt-Anleitung

Um ein dynamisches Diagramm mit einer Datumsachse in Excel zu erstellen, folge diesen Schritten:

  1. Vorbereitung der Daten:

    • Stelle sicher, dass dein Arbeitsblatt "Hilfswerte" die Daten korrekt aufbereitet hat. In Zelle A1:A4 sollten die Datumswerte und in Zelle C1:C4 die Noten stehen.
  2. VBA-Editor öffnen:

    • Drücke ALT + F11, um den VBA-Editor zu öffnen.
  3. Modul erstellen:

    • Füge ein neues Modul hinzu, indem du im Menü auf Einfügen > Modul klickst.
  4. VBA-Code für das Diagramm einfügen:

    • Kopiere den folgenden Code in dein Modul:
    Sub Diagramm_erstellen()
       ' vorhandene Diagramme löschen
       With ActiveSheet
           If .ChartObjects.Count > 0 Then .ChartObjects.Delete
       End With
    
       ' Diagramm erstellen
       Sheets("Uebersicht").Shapes.AddChart.Select
       ActiveChart.ChartType = xlXYScatterLines
    
       ' Position und Größe festlegen
       With ActiveChart.Parent
           .Left = 90
           .Top = 90
           .Width = 500
           .Height = 300
       End With
    
       ' Beschriftung Diagramm
       With ActiveChart
           .HasTitle = True
           .ChartTitle.Text = "mittlere Bewertung"
           .Axes(xlCategory, xlPrimary).HasTitle = True
           .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Datum"
           .Axes(xlValue, xlPrimary).HasTitle = True
           .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Note"
       End With
    
       ' Werte der x-Achse
       With ActiveChart
           .Axes(xlCategory).TickLabels.Orientation = 45
           .Axes(xlCategory).TickLabels.NumberFormat = "DD.MM.YYYY"
           .SeriesCollection.NewSeries
           .SeriesCollection(1).XValues = "='Hilfswerte'!$A$1:$A$4"
           .SeriesCollection(1).Values = "='Hilfswerte'!$C$1:$C$4"
       End With
    
       ' Werte der y-Achse
       With ActiveChart.Axes(xlValue)
           .MaximumScale = 4
           .MinimumScale = 0
           .MinorUnit = 1
           .MajorUnitIsAuto = True
       End With
    
       ' Gitternetzlinien hinzufügen
       With ActiveChart.Axes(xlCategory)
           .HasMajorGridlines = True
           .HasMinorGridlines = False
       End With
       With ActiveChart.Axes(xlValue)
           .HasMajorGridlines = True
           .HasMinorGridlines = False
       End With
    
       ' Daten in Diagramm einfügen
       ActiveChart.FullSeriesCollection.Name = "=""Durchschnittsnote"""
    End Sub
  5. Zusätzliche Methode zum Auslesen der Daten:

    • Füge auch den folgenden Code hinzu, um die Daten aus den Arbeitsblättern auszulesen:
    Sub WorksheetLoop()
       Dim WS_Count As Integer
       Dim I As Integer
       Dim L As Integer
       Dim name As String
       Dim note As String
    
       WS_Count = ActiveWorkbook.Worksheets.Count
       L = 1
       For I = 3 To WS_Count
           name = ActiveWorkbook.Worksheets(I).Name
           Sheets("Hilfswerte").Range("A" & L).Value = CDate(name)
           note = ActiveWorkbook.Worksheets(I).Range("C5")
           ActiveWorkbook.Worksheets("Hilfswerte").Range("C" & L).Value = note
           L = L + 1
       Next I
    End Sub
  6. Makro ausführen:

    • Schließe den VBA-Editor und führe das Makro Diagramm_erstellen aus, um dein Diagramm zu erstellen.

Häufige Fehler und Lösungen

  • Laufzeitfehler 1004: Dieser Fehler tritt häufig auf, wenn die Referenz zu den Daten nicht korrekt ist. Überprüfe, ob die Zellen in "Hilfswerte" die richtigen Daten enthalten.

  • Falsches Datumsformat auf der x-Achse: Stelle sicher, dass du die Datumswerte korrekt in das Format DD.MM.YYYY umwandelst, bevor du sie dem Diagramm zuweist.

  • Nicht angezeigte Datenreihe: Überprüfe, ob du .SeriesCollection.NewSeries vor der Zuweisung der x- und y-Werte verwendet hast.


Alternative Methoden

Falls du keine VBA-Programmierung verwenden möchtest, kannst du auch ein Diagramm manuell erstellen:

  1. Wähle die Daten in "Hilfswerte" aus.
  2. Gehe zu Einfügen > Diagramm und wähle den Diagrammtyp aus.
  3. Passe die Achsenbeschriftungen und das Format manuell an.

Praktische Beispiele

Ein Beispiel für eine Datumsachse in Excel könnte so aussehen:

  • Daten in Hilfswerte:
    • A1: 01.01.2021
    • A2: 02.01.2021
    • C1: 3
    • C2: 4

Beim Erstellen des Diagramms wird die x-Achse automatisch die Daten von A1:A2 verwenden und die y-Achse die Noten von C1:C2.


Tipps für Profis

  • Automatisierung: Du kannst das Diagramm regelmäßig aktualisieren, indem du das Makro in einem Zeitintervall oder bei bestimmten Ereignissen ausführen lässt.

  • Diagramm-Design: Nutze die Formatierungsoptionen in Excel, um dein Diagramm ansprechender zu gestalten. Dies umfasst die Anpassung von Farben, Linienstilen und Schriftgrößen.

  • VBA-TickLabels anpassen: Experimentiere mit der TickLabels-Eigenschaft, um die Darstellung der Achsen weiter zu optimieren.


FAQ: Häufige Fragen

1. Warum wird mein Diagramm nicht aktualisiert, wenn ich neue Daten hinzufüge?
Du musst sicherstellen, dass das Makro Diagramm_erstellen erneut ausgeführt wird, um die neuesten Daten zu verarbeiten.

2. Wie kann ich das Diagramm anpassen?
Du kannst die Eigenschaften im VBA-Code oder in der Excel-Oberfläche anpassen, um das Diagramm visuell zu verändern.

3. Was mache ich, wenn die Daten nicht korrekt dargestellt werden?
Überprüfe die Formatierung der Zellen in "Hilfswerte" und stelle sicher, dass die Datumswerte korrekt sind.

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