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

per VBA erstellte Diagramme variieren in der Höhe

Forumthread: per VBA erstellte Diagramme variieren in der Höhe

per VBA erstellte Diagramme variieren in der Höhe
16.03.2025 09:34:35
AS
Guten Morgen!

Ich sitze hier nun seit Stunden und verzweifle langsam..

Folgende Ausgangssituation: Ich möchte verschiedene Datenreihen (die regelmäßig erweitert werden), in verschiedenen Diagrammen darstellen. In Spalte B und C stehen die Messwerte (10 bzw. 12 etc.), in der Spalte G die unterschiedlichen Varianten (apfel, birne, ...), für die ich jeweils die passenden Werte zusammen darstellen möchte.

Beim Diagramm soll später also auf der vertikalen Achse der Wert aus Spalte B bzw. Spalte C stehen, die verschiedenen Varianten aus Spalte G geben vor, welche Werte aus Spalte B bzw. C genommen werden.

Die Werte, die auf der horizontalen Achse dargestellt werden, stehen in Spalte H (1, 2, 3).

Bei untenstehender Tabelle würde es also 2 Tabellen geben, bei denen auf der horizontalen Achse 1, 2 und 3 steht und jeweils der passende Wert links aus Spalte B aufgetragen wird und 2 Tabellen geben, bei denen auf der horizontalen Achse 1, 2 und 3 steht und jeweils der passende Wert links aus Spalte C aufgetragen wird.

In einem späteren Schritt wollte ich es dann noch so machen, dass immer nur die neuesten Daten im Diagramm angezeigt werden sollen (in Spalte J steht jeweils die Kalenderwoche). Soweit war ich aber noch nicht..



10 12 apfel 1 11
11 13 apfel 2 11
9 11 apfel 3 11
10 13 birne 1 11
8 14 birne 2 11
10 11 birne 3 11
8 12 apfel 1 12
9 13 apfel 2 12
11 11 apfel 3 12
13 13 birne 1 12
7 14 birne 2 12
12 11 birne 3 12


Dazu habe ich folgenden Code geschrieben:



Sub DiagrammeErstellen()

Dim ws As Worksheet
Dim lastRow As Long
Dim variante As String
Dim i As Long
Dim chartObj As ChartObject
Dim chartRange As Range
Dim chart As chart
Dim uniquevarianten As Collection
Dim cell As Range
Dim item As Variant
Dim startColumn As Long
Dim startRow As Long
Dim startRow2 As Long
Dim chartHeight As Long
Dim chartWidth As Long


Set ws = ThisWorkbook.ActiveSheet

lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row

Set uniquevarianten = New Collection

On Error Resume Next
For i = 2 To lastRow
variante = ws.Cells(i, "G").Value
uniquevarianten.Add variante, CStr(variante)
Next i
On Error GoTo 0


startRow = 2
startRow2 = 20
startColumn = 12
chartHeight = ws.Cells(1, 1).Height * 5
chartWidth = ws.Cells(1, 1).Width * 5


For Each item In uniquevarianten
variante = item

ws.Rows(1).AutoFilter Field:=7, Criteria1:=variante

Set chartObj = ws.ChartObjects.Add(Left:=ws.Cells(startRow, startColumn).Left, Width:=chartWidth, Top:=ws.Cells(startRow, startColumn).Top, Height:=chartHeight)
Set chart = chartObj.chart
chart.SetSourceData Source:=ws.Range("B1:B" & lastRow).SpecialCells(xlCellTypeVisible)
chart.ChartType = xlLine
chart.HasTitle = True
chart.ChartTitle.Text = ActiveSheet.Name & " " & variante & " varianteB"

chart.Axes(xlCategory, xlPrimary).HasTitle = True
chart.Axes(xlCategory, xlPrimary).AxisTitle.Text = "Punkt"
chart.Axes(xlValue, xlPrimary).HasTitle = True
chart.Axes(xlValue, xlPrimary).AxisTitle.Text = "werte varianteB"


Set chartObj = ws.ChartObjects.Add(Left:=ws.Cells(startRow2, startColumn).Left, Width:=chartWidth, Top:=ws.Cells(startRow2, startColumn).Top, Height:=chartHeight)
Set chart = chartObj.chart
chart.SetSourceData Source:=ws.Range("C1:C" & lastRow).SpecialCells(xlCellTypeVisible)
chart.ChartType = xlLine
chart.HasTitle = True
chart.ChartTitle.Text = ActiveSheet.Name & " " & variante & " varianteC"

chart.Axes(xlCategory, xlPrimary).HasTitle = True
chart.Axes(xlCategory, xlPrimary).AxisTitle.Text = "Punkt"
chart.Axes(xlValue, xlPrimary).HasTitle = True
chart.Axes(xlValue, xlPrimary).AxisTitle.Text = "werte varianteC"


ws.Rows(1).AutoFilter

startColumn = startColumn + 5

Next item

End Sub


Die Diagramme werden nicht zuverlässig erstellt und wenn sie erstellt werden, variiert die Höhe und auch der Startpunkt. Ich möchte allerdings zwei Reihen erhalten, die immer den gleichen Abstand zueinander haben, bei denen auch alle Diagramme immer gleich groß sind.

Über jede Anregung und Hilfe wäre ich sehr dankbar!

Viele Grüße
Alex
Anzeige

29
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: per VBA erstellte Diagramme variieren in der Höhe
16.03.2025 10:56:33
Oberschlumpf
Hi Alex,

ich werde zwar wahrsch nicht helfen können (Diagramme sind nich so meins), aber ich glaube trotzdem, dass andere besser helfen können, wenn du uns bitte per Upload eine Excel-Bsp-Datei mit deinen Bsp-Daten in den richtigen Zellen + Code zeigst - denn mit deiner Datei kann jeder besser testen, als dass "deine" Datei erst mal von möglichen Helfern erstellt werden müsste.

Ciao
Thorsten
Anzeige
AW: per VBA erstellte Diagramme variieren in der Höhe
16.03.2025 12:29:58
Marc
So wie ich das sehe, definierst du für den Chart ja auch keine Höhe/Breite oder Startpunkt...

z.B.



ActiveChart.Parent.Left = Range("B2").Left
ActiveChart.Parent.Top = Range("B2").Top



Höhe und Breite:



' Höhe und Breite festlegen
chartObj.Height = 300 ' Höhe in Punkten
chartObj.Width = 400 ' Breite in Punkten



Anzeige
AW: per VBA erstellte Diagramme variieren in der Höhe
16.03.2025 17:05:55
Uduuh
Hallo,
das kommt durch die Filterei. Dadurch verändern sich die Zellpositionen. Mach die Diagramme von der Zellposition und Größe unabhängig.
Set chartObj = ws.ChartObjects.Add(.....)

chartObj.Placement = xlFreeFloating


Außerdem solltest du keine Objekte als Variablen benutzen
Set chart = chartObj.chart
besser
Set myChart = chartObj.chart

Oder ganz ohne neues Objekt:
      Set chartObj = ws.ChartObjects.Add(Left:=ws.Columns(startColumn).Left, Width:=chartWidth, Top:=ws.Rows(startRow).Top, Height:=chartHeight)

chartObj.Placement = xlFreeFloating

With chartObj.chart
.SetSourceData Source:=ws.Range("B1:B" & lastRow).SpecialCells(xlCellTypeVisible)
.ChartType = xlLine
.HasTitle = True
.ChartTitle.Text = ActiveSheet.Name & " " & variante & " Anzahl1"

.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Text = "Punkt"
.Axes(xlValue, xlPrimary).HasTitle = True
.Axes(xlValue, xlPrimary).AxisTitle.Text = "Anzahl1"
End With


Gruß aus'm Pott
Udo
Anzeige
AW: per VBA erstellte Diagramme variieren in der Höhe
16.03.2025 19:55:51
Alex
Danke für deine Tipps und Erklärungen, das hilft mir sehr! :)

Viele Grüße
Alex
AW: Meinst du...
16.03.2025 19:54:09
Alex
Hi, Case!

Genau so habe ich es mir vorgestellt, vielen Dank! :)

Hättest du eine Idee, wie man den Code noch anpassen könnte, damit man immer die letzten drei Chargen (erkennbar an der Kalenderwoche) im gleichen Diagramm anzeigen lassen kann - also in jedem der in diesem Fall 6 Diagramme dann drei Datenreihen? Da müsste man vermutlich ein anderes Diagramm wählen, oder?

Viele Grüße
Alex
Anzeige
Das musst...
17.03.2025 09:31:08
Case
Moin Alex, :-)

... du - zumindest für mich - etwas genauer erklären bzw. anschaulich darstellen. ;-)

Servus
Case
Ich hoffe ...
17.03.2025 15:26:55
Alex
dass es mithilfe der Bsp.datei besser klappt! :)
https://www.herber.de/bbs/user/176309.xlsb

Jede Woche erhebe ich neue Daten, die dann unterhalb der alten Daten eingefügt werden. Diese lassen sich anhand des Kalenderjahrs und der -woche unterscheiden (Spalten I und J).

Jetzt war die Idee, dass alle Anzahl1-Werte, die zu "apfel" gehören, in einem Diagramm mit mehreren Linien dargestellt werden. Im markierten Fall sollten also im oberen linken Diagramm die beiden Anzahlen1 43 und 45 übereinander über dem x-Wert 1 zu sehen sein.

Da ich jede Woche neue Daten bekomme, würde ich gerne immer nur die letzten drei Datensätze im Diagramm anzeigen lassen, da es sonst zu viel wird.

Ich hoffe, dass es so besser nachvollziehbar ist, vor allem mit der Datei. :)

Viele Grüße und danke!
Alex
Anzeige
AW: Dann probiere...
18.03.2025 10:45:50
A
Das ist ja Wahnsinn, danke! :)

Da werde ich mich heute auf jeden Fall noch ordentlich durcharbeiten müssen. Gerade bin ich auf der Suche nach dem Grund, warum auf der x-Achse nur die Werte 1 bis 3 angezeigt werden, und nicht auch 4 bis 6.

Danach mache ich mich daran, dass nur die Datenreihen der letzten 3 KW angezeigt werden. Vermutlich muss ich dann wieder etwas nachfragen. Aber ich werde es versuchen. ;)

Ich merke doch immer wieder, wie wenig ich über VBA weiß. Danke für deine Hilfe!

Viele Grüße
A
Anzeige
AW: Dann probiere...
18.03.2025 11:01:28
A
Mir ist gerade aufgefallen, dass die Anzahlen nicht zu den passenden Punkten zugordnet werden.

Beispielsweise im ersten Diagramm (apfel - Anzahl1): Dort wird für KW 40 folgendes zugeordnet:
1 -> 46
2 -> 40
3 -> 42
4 -> fehlt
5 -> fehlt
6 -> fehlt
Die passenden Werte wären aber:
1 -> 43
2 -> 41
3 -> 40
4 -> 46
5 -> 40
6 -> 42
Damit hängt es auch vermutlich zusammen, dass nur die Hälfte der Punkte angezeigt wird im Diagramm. Spannend! Leider konnte ich den Fehler bisher nicht finden, werde aber weitersuchen.
Anzeige
Nun - du wolltest...
18.03.2025 11:06:23
Case
Moin Alex, :-)

... die letzten 3 Werte. Die sind drin. Ob da jetzt 1, 2 und 3 oder 4, 5 und 6 steht, lässt sich alles machen. So habe ich es verstanden. Du kannst ja alles abändern, wie du es möchtest. ;-)

Servus
Case
AW: Nun - du wolltest...
18.03.2025 11:12:01
A
Achso! Pardon, dann habe ich mich einfach falsch ausgedrückt. Da hast du natürlich Recht. Das war missverständlich.

Die letzten 3 Werte bezog sich bei mir auf die letzten 3 Kalenderwochen, die ich im Diagramm anzeigen lassen möchte, also bspw. nur die Datensätze von KW 40, 41 und 42 und nicht noch von KW 38 und 39.

Die Anzahlen 46, 40, 41 etc. müssen den richtigen Zahlen 1 bis 6 zugeordnet werden, da die Zahlen 1 bis 6 für unterschiedliche Ablageorte stehen.

Ich versuche, den Code entsprechend abzuändern, bisher scheitere ich jedoch noch. :D Habe bisher ganz viele Debug-Prints eingefügt, um langsam nachvollziehen zu können was wann und wo ausgegeben wird.

Danke für deine Geduld!

Viele Grüße
Alex
Anzeige
Da kommt es...
18.03.2025 11:18:53
Case
Moin Alex, :-)

... immer auf eine aussagekräftige Beispieldatei an. Bei nur 2 KWs in der Datei kann ich nicht 3 anzeigen. ;-)
Daher meine - dann wohl falsche - Einschätzung. ;-)

Servus
Case
AW: Da kommt es...
18.03.2025 11:37:59
A
Hi, Case,

stimmt. Da wären dann mehr als 3 Kalenderwochen besser gewesen. Beim nächsten Mal achte ich da mehr drauf. Danke, dass du dir so viel Zeit nimmst.

Hier eine bessere Beispieldatei:
https://www.herber.de/bbs/user/176316.xlsb

Ich muss gestehen, dass ich noch nicht nachvollziehen konnte, wo du eingefügt hast, dass die letzten drei Werte der 6er-Datenreihen genommen werden.

Viele Grüße
Alex
Anzeige
Wenn ich das richtig...
18.03.2025 11:58:42
Case
Moin Alex, :-)

... verstehe, dann möchtest du alle Werte von 3 KWs? Also z. B. ab KW 40 bis KW 42 alle Werte. Das wären dann 3 Linien mit 6 Punkten - zumindest in dem Beispiel. Richtig? ;-)
Oder wie willst du vorgeben, welche KWs ausgewertet werden sollen?

Aufwändig ist das nicht, bin nur etwas auf Achse und kann es erst heute Abend machen. ;-)

Servus
Case
Anzeige
AW: Wenn ich das richtig...
18.03.2025 13:43:33
Alex
Hi, Case,

genau, ja, alle Werte von 3 KWs! :)
Irgendwann könnten es auch mal mehr als 6 Punkte sein, falls sich die Anzahl der Orte (Spalte H) ändert, aber aktuell sind es immer 6.
Bei den KWs war es so geplant, dass immer die letzten, also neuesten 3 dargestellt werden sollen, also in der Beispieldatei dann KW41, KW42 und KW1, da KW1 im neuen Jahr liegt.

Noch eine zusätzliche Frage: Ist es richtig, dass ich ein Kombi-Diagramm erstellen müsste, wenn ich zusätzlich noch in jedem Diagramm eine untere Grenze als horizontale, gestrichelte Linie anzeigen lassen wollte? Also eine untere Grenze für die Diagramme mit Anzahl1 und eine andere für die Diagramme mit Anzahl2.

Wie lange arbeitest du schon mit Excel VBA, dass du sowas so schnell hinbekommst?

Viele Grüße
Alex
Anzeige
Im Anhang...
18.03.2025 19:15:24
Case
Moin Alex, :-)

... für die letzten drei KWs: ;-)
https://www.herber.de/bbs/user/176324.xlsb

Mit Diagrammen arbeite ich sehr wenig. Kenne mich da nicht gut aus. ;-)
Mit Programmieren werkel ich seit den 70gern rum. VBA seit den 90gern. ;-)

Jetzt nur noch zur Gaudi. Mache lieber etwas mit Power Query. Ist spannender. ;-)

Servus
Case
Anzeige
AW: Im Anhang...
18.03.2025 21:55:42
Alex
Guten Abend, Case!

Na wenn du dich wenig mit Diagrammen auskennst... dann kann ich wohl ab sofort nicht mehr sagen, dass ich mich ganz gut mit Excel auskenne. :D

Die neue Version funktioniert super, danke!
Über Power Query habe ich auch nur gute Sachen gehört, aber damit muss ich wohl noch etwas warten und mich erst hier ordentlich einarbeiten.

Eine Frage hätte ich tatsächlich gerade noch: An welcher Stelle des Codes könnte ich denn noch eine untere Grenze ins Diagramm einfügen? Also eine horizontale gestrichelte Linie, die in jedem Diagramm auftaucht. Den Wert würde ich gerne für Anzahl1 und Anzahl2 separat festlegen können, also unterschiedliche untere Grenzen.

Viele Grüße
Alex
Anzeige
Da gibt es...
19.03.2025 11:27:48
Case
Moin Alex, :-)

... verschiedene Möglichkeiten: ;-)
https://www.herber.de/bbs/user/176336.xlsb

Wenn die Daten weit oben liegen, dann sieht das Ganze etwas gestaucht aus. Dann kann man die Y-Achse anders beginnen lassen (siehe Code im Modul4). ;-)

Servus
Case
Anzeige
AW: Da gibt es...
19.03.2025 12:48:33
Alex
Hi, Case,

genau so habe ich es mir vorgestellt, danke!
Vor allem kann ich, da du so schnell alle meine Probleme gelöst hast, mich mit Sachen beschäftigen, die erst für viel später angedacht waren. Vielen vielen Dank! :-)

Kannst du mir einen Tipp geben, wo ich ansetzen müsste, um den Code so anzupassen, dass auch mehr als 6 Punkte möglich wären - also dass sich die x-Achse automatisch anpasst? Mit 6 oder weniger Punkten klappt es ja auch so schon, aber wenn ich einen 7. Punkt in den Daten einfüge, bleibt die Stelle auf der x-Achse frei, die Anzahlen werden aber eingetragen.

Viele Grüße und einen sonnigen Tag! :-)
Alex
Anzeige
Da kann ich...
19.03.2025 13:59:03
Case
Moin Alex, :-)

... im Moment nichts zu sagen. Habe in KW 41 bei "tomate" eine 7 Zeile hinzugefügt und er zeigt alles im Diagramm an. ;-)

Servus
Case
Interessanterweise..
19.03.2025 18:23:08
Alex
Hi, Case,

...geht es nur nicht, wenn man bei "birne" einen 7. Punkt einfügt.
Bei tomate und apfel geht es. Aber auch witzig, dass wir genau die unterschiedlichen Varianten getestet haben.

Viele Grüße
Alex
Anzeige
AW: per VBA erstellte Diagramme variieren in der Höhe
16.03.2025 13:21:28
Alex
Danke für deine Antwort!

Die Angaben lege ich doch mit



startRow = 2
startRow2 = 20
startColumn = 12
chartHeight = ws.Cells(1, 1).Height * 5
chartWidth = ws.Cells(1, 1).Width * 5

...

Set chartObj = ws.ChartObjects.Add(Left:=ws.Cells(startRow, startColumn).Left, Width:=chartWidth, Top:=ws.Cells(startRow, startColumn).Top, Height:=chartHeight)


fest, oder? Möglicherweise übersehe ich auch etwas ganz simples. Kenne mich mit Diagrammen noch überhaupt nicht aus.

Mit dem von dir vorgeschlagenen Code klappt es leider auch nicht.
Anzeige
AW: per VBA erstellte Diagramme variieren in der Höhe
16.03.2025 13:39:25
Marc
du definierst die Höhe deiner Chart hier in dem du die variable Höhe der Zelle A1 benutzt ...

sprich ändert sich warum auch immer die Höhe und Breite von "Cells(1, 1)" ändern sich die Chart Werte..
und da du da Cells(1, 1).height *5 rechnest.. kann das schnell sehr unterschiedlich aussehen...

Beispiele:
ist die Höhe von Cells(1, 1) = 1
dann
chartHeight = 5

ist die Höhe von Cells(1, 1) = 2
dann
chartHeight = 10


ist die Höhe von Cells(1, 1) = 3
dann
chartHeight = 15


etc...


Anzeige
AW: per VBA erstellte Diagramme variieren in der Höhe
16.03.2025 13:42:08
Alex
Hi, Marc,

das stimmt. Aber die Größe der Zelle ändert sich tatsächlich nicht. Ich habe zwischenzeitlich an verschiedenen Stellen MsgBoxen mit den aktuellen Werten anzeigen lassen und in allen Fällen passt die Größe. Nur beim eingefüten Diagramm nicht...

Eine fixe Größe wäre mir auch lieber, aber das hatte bei mir zu noch größeren Problemen geführt.
Anzeige
AW: per VBA erstellte Diagramme variieren in der Höhe
16.03.2025 14:06:30
Marc
Hmm

vielleicht liegt es daran das du
2x


Set chartObj = ws.ChartObjects.Add(Left:=ws.Cells(startRow, startColumn).Left, Width:=chartWidth, Top:=ws.Cells(startRow, startColumn).Top, Height:=chartHeight)
Set chart = chartObj.chart


hintereinander als Objekt benutzt, statt 2 Objekte draus zu machen...

grundsätzlich sollte ein Objekt fix sein, und sich nicht im Laufe des Programms in ein anderes Objekt verändern..
Und wenn ich das richtig sehe erstellst du das Objekt nutzt es machst daraus etwas..

und dann veränderst du es und machst daraus eigentlich ein neues Objekt



'1. Mal
Set chartObj = ws.ChartObjects.Add(Left:=ws.Cells(startRow, startColumn).Left, Width:=chartWidth, Top:=ws.Cells(startRow, startColumn).Top, Height:=chartHeight)
Set chart = chartObj.chart
chart.SetSourceData Source:=ws.Range("B1:B" & lastRow).SpecialCells(xlCellTypeVisible)
chart.ChartType = xlLine
chart.HasTitle = True
chart.ChartTitle.Text = ActiveSheet.Name & " " & variante & " varianteB"

chart.Axes(xlCategory, xlPrimary).HasTitle = True
chart.Axes(xlCategory, xlPrimary).AxisTitle.Text = "Punkt"
chart.Axes(xlValue, xlPrimary).HasTitle = True
chart.Axes(xlValue, xlPrimary).AxisTitle.Text = "werte varianteB"
'Hier würde sonst noch ein is Nothing fehlen


'2. Mal
Set chartObj = ws.ChartObjects.Add(Left:=ws.Cells(startRow2, startColumn).Left, Width:=chartWidth, Top:=ws.Cells(startRow2, startColumn).Top, Height:=chartHeight)
Set chart = chartObj.chart
chart.SetSourceData Source:=ws.Range("C1:C" & lastRow).SpecialCells(xlCellTypeVisible)
chart.ChartType = xlLine
chart.HasTitle = True
chart.ChartTitle.Text = ActiveSheet.Name & " " & variante & " varianteC"

chart.Axes(xlCategory, xlPrimary).HasTitle = True
chart.Axes(xlCategory, xlPrimary).AxisTitle.Text = "Punkt"
chart.Axes(xlValue, xlPrimary).HasTitle = True
chart.Axes(xlValue, xlPrimary).AxisTitle.Text = "werte varianteC"


Anzeige
AW: per VBA erstellte Diagramme variieren in der Höhe
16.03.2025 19:57:26
Alex
Danke für den Hinweis mit der Bezeichnung. Das ergibt Sinn. :)

Forumthreads zu verwandten Themen