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

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

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

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige
Archiv - Verwandte Themen
Forumthread
Beiträge