Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1960to1964
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Excel VBA - Zeitangabe in Balkendiagramm

Excel VBA - Zeitangabe in Balkendiagramm
01.02.2024 13:44:21
Klaus Kurras
Hallo zusammen,

Ich bin meist stiller Mitleser und habe schon einige Probleme mit Hilfe dieses Forums lösen können. Möchte mich an dieser Stelle bei allen dafür bedanken.
Nun zu meinem Problem:
Ich habe in einer Excel Tabelle 2 Spalten, die ich zu einem Balkendiagramm verarbeiten soll. Es handelt sich dabei um Störungen, die mit Dauer und dem sogenannten Technischen Platz (Anlage, genaue Station etc.) deklariert sind. Als Beispiel:

Gesamt Stördauer / Techn. Platz
00:24:30 / Verpackungsanlage - Station 9
00:12:30 / Etikettierung

(Das "/" soll die Spaltentrennung sein)

Nun möchte ich auf der linken Seite den Namen des Techn. Platzes haben und als Balken die Dauer der Störung.
Ich habe schon einiges versucht, mit VBA kenne ich mich einigermaßen aus, aber bei Diagrammen hört es bei mir auf.
Excel gibt mir über die Bordmittel leider nichts gescheites raus und ein Gantt Diagramm kommt für mich in diesem Fall (so glaube ich) nicht in Frage.

Ich hoffe auf eine Eingebung eurer Seits.

Vielen Dank

Grüße
Klaus

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Excel VBA - Zeitangabe in Balkendiagramm
01.02.2024 16:59:08
Beverly
Hi Klaus,

setze den Cursor in eine leere Zelle und erstelle ein (leeres) Balkendiagramm. Danach Rechtsklick auf das Diagramm -> Daten auswählen... -> im linken (unteren) Fenster bei "Legendeneinträge (Reihen)": Hinzufügen -> "Reihenwerte" und dort den Bereich mit den Uhrzeiten im Tabellenblatt auswählen (oder von Hand eintragen) -> Ok. Dann im rechten Fenster "Horizontale Achsenbeschriftung (Rubrik)": Bearbeiten -> "Achsenbeschriftungsbereich" und dort den Zellbereich mit den Technischen Plätzen im Tabellenblatt auswählen (oder von Hand eintragen) -> Ok -> Ok.

Bis später
Karin

Link zur Homepage: https://excel-inn.de/
Anzeige
AW: Excel VBA - Zeitangabe in Balkendiagramm
01.02.2024 20:48:47
Klaus Kurras

Hi Klaus,

setze den Cursor in eine leere Zelle und erstelle ein (leeres) Balkendiagramm. Danach Rechtsklick auf das Diagramm -> Daten auswählen... ->
im linken (unteren) Fenster bei "Legendeneinträge (Reihen)": Hinzufügen ->
"Reihenwerte" und dort den Bereich mit den Uhrzeiten im Tabellenblatt auswählen (oder von Hand eintragen) ->
Ok. Dann im rechten Fenster "Horizontale Achsenbeschriftung (Rubrik)": Bearbeiten ->
"Achsenbeschriftungsbereich" und dort den Zellbereich mit den Technischen Plätzen im Tabellenblatt auswählen (oder von Hand eintragen) -> Ok -> Ok.

Bis später
Karin

Link zur Homepage: https://excel-inn.de/


Vielen lieben dank Katrin, damit kann ich arbeiten.

Grüße
Klaus
Anzeige
AW: Excel VBA - Zeitangabe in Balkendiagramm
02.02.2024 19:46:49
Klaus Kurras
Hallo, ich nochmal.

Ich bin am verzweifeln...

Mit Karins Hilfe habe ich per Makrorekorder ein Balkendiagramm erstellen können, das meinen Anforderungen entspricht.
Nun versuche ich per VBA den Bereich für die X und Y Achse variable zu gestalten, was mich bereits einige Nerven gekostet hat.

Per Makro Rekorder werden die Achsen so angegeben:
    ActiveChart.FullSeriesCollection(1).Values = "=Zwischenspeicher!R2C1:R22C1"

ActiveChart.FullSeriesCollection(1).XValues = "=Zwischenspeicher!R2C2:R22C2"

Zwischenspeicher ist dabei der Name des Tabellenblattes.

Nun versuche ich mit folgendem Makro die Bereich variabel zu machen:
Sub Diagramm_erstellen()



Dim lastRow As Long
Dim rngValues As Range
Dim rngXValue As Range

Charts.Add2
Charts.Move after:=Sheets(Sheets.Count)
Charts(1).Activate

lastCol = ThisWorkbook.Worksheets("Zwischenspeicher").UsedRange.Columns.Count

With ActiveChart

.SetSourceData Source:=Range("Zwischenspeicher!$J$32")
.ChartType = xlBarClustered
.ChartTitle.Text = "TM Diagramm"

With ThisWorkbook.Worksheets("Zwischenspeicher")
lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
Set rngValues = .Range(.Cells(2, 1), .Cells(lastRow, 1))
Set rngXValues = .Range(.Cells(2, 2), .Cells(lastRow, 2))

MsgBox rngValues.Address(ReferenceStyle:=xlR1C1)
End With

'In dieser Zeile bleibt der Debugger stehen - Laufzeitfehler 1004: Anwendungs- oder objektdefinierter Fehler
.FullSeriesCollection(1).Values = ThisWorkbook.Worksheets("Zwischenspeicher").Range(rngValues.Address(ReferenceStyle:=xlR1C1))
.FullSeriesCollection(1).XValues = ThisWorkbook.Worksheets("Zwischenspeicher").Range(rngXValues.AddressLocal)

' Dieser Bereich ist noch vom Makro Rekorder - bitte ignorieren
End With
With Selection.Format.TextFrame2.TextRange.Characters(1, 13).ParagraphFormat
.TextDirection = msoTextDirectionLeftToRight
.Alignment = msoAlignCenter
End With
With Selection.Format.TextFrame2.TextRange.Characters(1, 13).Font
.BaselineOffset = 0
.Bold = msoFalse
.NameComplexScript = "+mn-cs"
.NameFarEast = "+mn-ea"
.Fill.Visible = msoTrue
.Fill.ForeColor.RGB = RGB(89, 89, 89)
.Fill.Transparency = 0
.Fill.Solid
.Size = 14
.Italic = msoFalse
.Kerning = 12
.Name = "+mn-lt"
.UnderlineStyle = msoNoUnderline
.Spacing = 0
.Strike = msoNoStrike
End With
ActiveChart.ClearToMatchStyle
ActiveChart.ChartStyle = 218
End Sub


In Zeile
.FullSeriesCollection(1).Values = ThisWorkbook.Worksheets("Zwischenspeicher").Range(rngValues.Address(ReferenceStyle:=xlR1C1))
bleibt mir der Debugger mit Fehler 1004 stehen.
Ich habe schon verschiedene Syntax versucht...
rngValues.AddressLocal

rngValues.Address

und auch
rngValues.Address(ReferenceStyle:=xlR1C1)

Leider ohne Erfolg.

Die MsgBox gibt mir den korrekten Syntax (in dem Falle R2R1:R22R1) aber ich weiß nicht, warum die FullSeriesCollection(1) den Wert nicht nehmen möchte.

Ich stehe auf dem Schlauch, bin langsam Code Blind und brauche euren Input, was eventuell falsch läuft.

Ich danke für eure Zeit und Geduld.

Grüße
Klaus
Anzeige
Diagramm Datenreihe Wertebereiche zuweisen - VBA
02.02.2024 19:57:14
Beverly
Hi Klaus,

versuche anstelle

        .FullSeriesCollection(1).Values = ThisWorkbook.Worksheets("Zwischenspeicher").Range(rngValues.Address(ReferenceStyle:=xlR1C1))

.FullSeriesCollection(1).XValues = ThisWorkbook.Worksheets("Zwischenspeicher").Range(rngXValues.AddressLocal)


dieses (ungetestet):

        .FullSeriesCollection(1).Values = rngValues

.FullSeriesCollection(1).XValues = rngXValues


Bis später
Karin

Link zur Homepage: https://excel-inn.de/

Anzeige
AW: Diagramm Datenreihe Wertebereiche zuweisen - VBA
02.02.2024 20:51:51
Klaus Kurras
Hallo Karin,

Bei deinem Vorschlag kommt der Fehler "Laufzeitfehler 1004 - Der Parameter ist ungültig".

Ich hab mir mittels MsgBox einen String zusammen gebaut der wie folgt aussieht:
MsgBox "=" & ThisWorkbook.Worksheets("Zwischenspeicher").Name & "!" & rngValues.Address(ReferenceStyle:=xlR1C1) & ""

Als Ergebnis bekomme ich
=Zwischenspeicher!R2C1:R22C1

also auch das gleiche, was in der vom Makro Rekorder aufgenommenen Stelle
ActiveChart.FullSeriesCollection(1).Values = "=Zwischenspeicher!R2C1:R22C1"

raus kommt.

Aber auch hier bekomme ich den Fehler "Laufzeitfehler 1004 - Der Parameter ist ungültig".

Noch irgendwelche Vorschläge?

Grüße
Klaus
Anzeige
AW: Gelöst -Diagramm Datenreihe Wertebereiche zuweisen - VBA
02.02.2024 21:50:10
Klaus Kurras
Hab die Lösung gefunden.

Bevor der X und Y Achse ein Wert zugewiesen werden kann (FullSeriesCollection) muss der Befehl
.SeriesCollection.NewSeries
hinzugefügt werden. Meine Syntax war also korrekt, nur die Zuordnung der Collection nicht.
Im Anschluss der funktionierende Code.

Füge ein Diagrammblatt ein und nutze die Daten des Tabellenblattes "Zwischenspeicher". Range wird ermittelt und an Diagramm übergeben.

Sub Diagramm_erstellen()



Dim lastRow As Long
Dim lastCol As Long
Dim rngValues As Range
Dim rngXValue As Range

Dim strValues As String
Dim strXValues As String

'Diagrammblatt an letzte Stelle einfügen
Charts.Add2
Charts.Move after:=Sheets(Sheets.Count)
Charts(1).Activate

'Letzte Spalte im Tabellenblatt Zwischenspeicher ermitteln
lastCol = ThisWorkbook.Worksheets("Zwischenspeicher").UsedRange.Columns.Count

With ActiveChart

.SetSourceData Source:=Range("Zwischenspeicher!$J$32")
.ChartType = xlBarClustered
.ChartTitle.Text = "TM Diagramm"

'Bereich für X und Y Achse ermitteln
With ThisWorkbook.Worksheets("Zwischenspeicher")
lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
Set rngValues = .Range(.Cells(2, 1), .Cells(lastRow, 1)) ' X Achse
Set rngXValues = .Range(.Cells(2, 2), .Cells(lastRow, 2)) ' Y Achse

'Name des Worksheets und Adresse im R1C1 Style in String schreiben
strValues = "='" & ThisWorkbook.Worksheets("Zwischenspeicher").Name & "'!" & rngValues.Address(ReferenceStyle:=xlR1C1) & ""
strXValues = "='" & ThisWorkbook.Worksheets("Zwischenspeicher").Name & "'!" & rngXValues.Address(ReferenceStyle:=xlR1C1) & ""

End With

'X und Y Achse Werte zuweisen
.SeriesCollection.NewSeries
ActiveChart.FullSeriesCollection(1).Values = strValues
ActiveChart.FullSeriesCollection(1).XValues = strXValues


End With
ActiveChart.ClearToMatchStyle
ActiveChart.ChartStyle = 218
End Sub


Vielen Dank an Euch

Grüße
Klaus
Anzeige
Deine Lösung ist fehlerhaft
02.02.2024 23:50:42
Beverly
Hi Klaus,

dein letzter Code gibt übrigens in den folgenden beiden Zeilen

           Set rngXValues = .Range(.Cells(2, 2), .Cells(lastRow, 2)) ' Y Achse

und

             strXValues = "='" & ThisWorkbook.Worksheets("Zwischenspeicher").Name & "'!" & rngXValues.Address(ReferenceStyle:=xlR1C1) & ""

beim Kompilieren den Fehler "Variable nicht deklariert" aus, da deine Variable nicht als rngXValues sondern als rngXValue deklariert ist. Außerdem sollten XValues im Diagramm die X- und nicht die Y-Werte sein (vgl. deinen Kommentar). Weiter unten im Code weist du nämlich den X-Werten des Diagramm den Zellbereich strXValues und den Y-Werten strValues zu.


Das generelle Problem bei deinem Code ist , dass das Diagramm beim Erstellen bereits eine Datenreihe hatte (was ja standardmäßig der Fall ist), die du jedoch mit der Codezeile

        .SetSourceData Source:=Range("Zwischenspeicher!$J$32")


wieder löschst. Und das passiert in dem Fall, wenn die Zelle J32 leer ist!! Logischerweise kann einer nicht exisitierenden Datenreihe kein Zellbereich als X- und Y-Wertebereich zugewiesen werden. Mein oben geposteter Code ist also ebenfalls völlig korrekt - der Fehler liegt in deinem Diagramm ohne Datenreihe.

Diagramme müssen nicht aktiviert werden um per VBA bearbeitet zu werden. Es ist außerdem Quatsch, zuerst den Zellbereich als Range zu deklarieren und zu belegen und anschließend davon die Adresse zu verwenden.

Sub Diagramm_erstellen()

Dim lastRow As Long
Dim rngValues As Range
Dim rngXValues As Range
Dim lngReihe As Long

'Letzte Zeile im Tabellenblatt Zwischenspeicher ermitteln und X-/Y-Wertebereich festlegen
With ThisWorkbook.Worksheets("Zwischenspeicher")
lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
Set rngValues = .Range(.Cells(2, 1), .Cells(lastRow, 1)) ' Y-Werte
Set rngXValues = .Range(.Cells(2, 2), .Cells(lastRow, 2)) ' X-Werte
End With

'Diagrammblatt erstellen
With Charts.Add2
'an letzte Position verschieben
.Move after:=Sheets(Sheets.Count)
'Diagrammtyp gruppierte Balken
.ChartType = xlBarClustered
'Diagrammtitel
.ChartTitle.Text = "TM Diagramm"
'Diagrammstil zuweisen
.ClearToMatchStyle
.ChartStyle = 218
'falls mehr als 1 Datenreihe erstellt wurden
If .SeriesCollection.Count > 1 Then
' Schleife über alle Datenreihen rückwärts wobei 1 Datenreihe erhalten bleibt
For lngReihe = .SeriesCollection.Count To 2 Step -1
.SeriesCollection(lngReihe).Delete
Next lngReihe
End If
'Datenreihe 1 den Y-Wertebereich und den x-Wertebereich zuweisen
With .SeriesCollection(1)
.Values = rngValues
.XValues = rngXValues
End With
End With
End Sub


Bis später
Karin

Link zur Homepage: https://excel-inn.de/
Anzeige
AW: Deine Lösung ist fehlerhaft
03.02.2024 13:56:30
Klaus Kurras
Hallo Karin,

Der Fehler beim Kompilieren war unnötig, einfacher Schreibfehler meinerseits.

Aber wie bereits geschrieben habe ich das Makro auf Basis eines Makrorekorder generiertes Makro erstellt und versucht an meine Bedürfnisse anzupassen.
Auch das ich das Chart auf Active gestellt habe, habe ich im Zuge des Debuggen gemacht. Anders wusste ich mir nicht zu helfen.

Dein Code sieht wirklich sehr aufgeräumt aus, jedoch bekomm ich bei
With .SeriesCollection(1)
den Laufzeitfehler 1004 - Der Parameter ist ungültig. Ich vermute das es das selbe Problem ist, was ich auch hatte; die SeriesCollection ist nicht korrekt deklariert. Aber das ist bisher nur eine Vermutung.

Ich werde mich nochmal dran setzen und wieder Meldung geben.

Vielen Dank für deine Hilfe

Grüße
Klaus
Anzeige
AW: Deine Lösung ist fehlerhaft
03.02.2024 16:49:19
Klaus Kurras
Hallo zusammen,

Habe es nun folgender maßen gelöst:
Sub Diagramm_erstellen()



Dim lastRow As Long
Dim rngValues As Range
Dim rngXValues As Range



'Bereich für X und Y Achse ermitteln
With ThisWorkbook.Worksheets("Zwischenspeicher")
lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
Set rngValues = .Range(.Cells(2, 1), .Cells(lastRow, 1)) ' Y Achse
Set rngXValues = .Range(.Cells(2, 2), .Cells(lastRow, 2)) ' X Achse
End With

'Diagrammblatt erstellen
With Charts.Add2
'an letzte Position verschieben
.Move after:=Sheets(Sheets.Count)
'Diagrammtyp gruppierte Balken
.ChartType = xlBarClustered
'Diagrammtitel
.ChartTitle.Text = "TM Diagramm"
'Diagrammstil zuweisen
.ClearToMatchStyle
.ChartStyle = 218
'Y und X Achse Werte zuweisen
.SeriesCollection.NewSeries
.SeriesCollection(1).Values = rngValues
.SeriesCollection(1).XValues = rngXValues
End With

End Sub


In diesem Makro wird auf eine Abfrage der SeriesCollection verzichtet, da diese einen Fehler auswirft. Zum Zeitpunkt der Abfrage gibt es keine, somit bleibt der Count auf 0. Statt dessen wird eine SeriesCollection hinzugefügt und diese dann mit den Werten befüllt.
Danke nochmal an Karin.

Gruß
Klaus
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige