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

100 Balkendiagramme sauber auf Excelseiten positionieren?

Forumthread: 100 Balkendiagramme sauber auf Excelseiten positionieren?

100 Balkendiagramme sauber auf Excelseiten positionieren?
12.06.2025 15:27:25
widdi
Hallo Zusammen,

ich habe im Forum schon gesucht und etwas gefunden, was mich jetzt nicht weiter gebracht hat (aus 2019: https://www.herber.de/forum/archiv/1684to1688/1687066_Grafiken_per_VBA_kopieren_Top_Eigenschaft.html#1)

Folgendes Problem:
Ich habe eine Tabelle mit 6 Wertspalten (01:T1 - voll und ganz, großteils, weder noch, weniger, gar nicht, Durchschnitt) und 2 Beschreibungsfeldern (L1, M1, Chart-Titel und Subtitel)
Ich bekomme eine Tabelle mit 100 Einträgen (N2:T101). (N enthält die X-Achsentexte)
Aus diesen möchte ich Grafiken erstellen. Dies funktioniert mit folgendem Code recht gut (Beispiel hat nur 9 Grafiken, Screenshot unten)



Sub Erstellen()

For i = 0 To 8
Dim chartObj As ChartObject
If i = 0 Then
Set chartObj = ActiveSheet.ChartObjects.Add(0, 0, 680, 370)
Else
Set chartObj = ActiveSheet.ChartObjects.Add(0, (473 * i - 2 * i), 680, 370)
End If

With chartObj.Chart
.ChartType = xlColumnClustered
.SetSourceData Source:=Range("O" & i + 2 & ":T" & i + 2)
.HasTitle = True
.ChartTitle.Text = Range("L1").Value & vbLf & Range("M1").Value
.ChartTitle.Characters(1, InStr(.ChartTitle.Text, vbLf) - 1).Font.Size = 16
.ChartTitle.Characters(InStr(.ChartTitle.Text, vbLf) + 1, Len(.ChartTitle.Text) - InStr(.ChartTitle.Text, vbLf)).Font.Size = 12

.Axes(xlCategory).TickLabels.Font.Size = 8
.Axes(xlCategory).HasTitle = True
.Axes(xlCategory).AxisTitle.Text = Range("N" & i + 2).Value
.Axes(xlCategory).CategoryNames = Range("O1:T1").Value
.Legend.Position = xlLegendPositionBottom
.Legend.Delete ' Legende wird ausgeblendet, da bei verschiedenen Farben die Legenden mit den Werten belegt werden und dann die Darstellung doppelt wäre
For j = 1 To .SeriesCollection.Count
.SeriesCollection(j).Points(6).Interior.Color = RGB(0, 206, 209) 'färbt die "Durchschnittsspalte" anders ein
' .SeriesCollection(j).Name = Range("N" & i + 2).Value ' das kann alternativ zum Achsentitel X genommen werden, wenn alle die gleiche Farbe haben
' dann wird die Legende als Spaltentitel eingesetzt
Next j
.ChartGroups(1).GapWidth = 120 ' ändert die Spaltenbreiten. Es gibt aber minimale und maximale Grenzen.
.ChartGroups(1).Overlap = 70 ' über "SeriesCollection" funktionierte die Definition nicht
End With
Range("B" & (i * 33 + 30)).Value = "FußZeile 1"
Range("B" & (i * 33 + 31)).Value = "FußZeile 2"
Next i

End Sub


Mein Problem ist jetzt folgendes:
Ursprünglich hatte ich statt dem "if then else" oben folgende Definition:
        Set chartObj = ActiveSheet.ChartObjects.Add(Left:=Range("A" & (i * 33 + 1)).Left, Width:=685, Top:=Range("A" & (i * 33 + 1)).Top, Height:=470)

Wenn ich mir die Seitenansicht ansehe, bekomme ich ja die "Seitenumbrüche" angezeigt. Und bei einer Standard-Excel-Seite waren eben 33 Zeilen bei mir eine Seite. Das heisst Zeile 1, 34, 67, 100,... sind immer auf einer neuen Seite und das "Range(ZELLE).Top" hätte mir eigtl. den oberen Rand geben müssen. Aber das ganze rutscht nach unten.
Also dachte ich mir - ich nehme fixe Werte und habe eben eine Höhe von 437 bestimmt. Aber auch da.. verrutschen. Darauf hin hing ich noch nach Schleifendurchlauf ein "-i" an, bzw. jetzt "-2*i". Was soll ich sagen: Es wird besser - aber passt eben nicht.
Was mich halt irritiert. Schon der Wert RANGE("A100").Top wird ursprünglich falsch bestimmt. Aber auch wenn ich das wieder einsetze und Minus i oder Minus 2i rechne... schon bei 9 Grafiken habe trotz des Korrekturfaktors -2i einen Versatz.

Klar könnte ich nach 10 Bildern ein neues Tabellenblatt beginnen und dann die Grafiken zusammen als PDF exportieren. Aber das wäre nur eine Krücke. Wie kann ich sauber die Zellen"oberkante" oder den Seitenumbruch referenzieren, ohne irgendwelche Korrekturen zu berechnen. Vor allem, da ja auch "-2i" nicht sauber trifft (und immer mehr korrigiert, 2, 4, 6, 8, 10,... bis zu 200). beim Screnshot heisst das also "-18"
Achja... "Left" ist egal. das geht. Ich habe nur einen Höhenversatz.
Auch wenn ich die 4 Variablem mit "Position" statt Zuweisung .Add(links, oben, breite, höhe) angebe.... kein Unterschied.

Danke für n paar Ideen.

Userbild

Anzeige
AW: 100 Balkendiagramme sauber auf Excelseiten positionieren?
12.06.2025 16:43:19
daniel
Hi

wie hättest du es denn gerne? Jedes Diagramm auf einer Seite?
dann würde ich so vorgehen.
1. Fußzeile nicht in der Tabelle, sondern als echte Fußzeilen beim Seite-Einrichten anlegen (die erscheinen dann automatisch auf jeder Seite)
2. Diagramme so dicht wie möglich packen (Abstand = Diagrammhöhe 2-3 Zeilen)
3. vor jedem Diagramm einen harten Zeilenumbruch einfügen.

Sub Erstellen()

'Fußzeile auf Druckseite
With ActiveSheet.PageSetup
.LeftFooter = "Fußzeile 1" & Chr(10) & "Fußzeile 2"
End With
ActiveSheet.ResetAllPageBreaks

For i = 0 To 8
'Blätter mit 3 Zeilen abstand erstellen
Set chartObj = ActiveSheet.ChartObjects.Add(0, (370 + Range("A1:A3").Height) * i, 680, 370)
'harter Zeilenumbruch vor jedem Diagramm (außer dem ersten) und Diagramm an den oberen Zellenrand veschieben
If i > 0 Then
ActiveSheet.HPageBreaks.Add chartObj.TopLeftCell
chartObj.Top = chartObj.TopLeftCell.Top
End If
With chartObj.Chart
'...
'--- dein Code zum erstellen des Charts
'...
End With

Next i

End Sub


wenn eine Fußzeilen für jedes Blatt anders sind und deswegen ins Tabellenblatt eingetragen werden müssen, dann würde ich die auch direkt unter dem Diagramm einfügen:

cells(chartObj.BottomRightCell.Row + 1, 1).Value = "Fußzeile 1"

cells(chartObj.BottomRightCell.Row + 2, 1).Value = "Fußzeile 2"


Anzeige
AW: 100 Balkendiagramme sauber auf Excelseiten positionieren?
13.06.2025 09:43:50
widdi
Guten Morgen,

Danke für den Vorschlag.
Die Idee dahinter ist folgende: ich bekomme aus einem System eine Tabelle; daraus werden die Grafiken erstellt (je Seite 1 Grafik) und das Ganze dann nach PDF exportieren.

Deine Lösung mit "height" funktioniert zwar auch, wie mein Ansatz - aber auch hier schieben die Grafiken immer weiter nach unten. Dein 2./3. Punkt entspricht ja dem Ansatz von xlKing. Je Zeile eine Grafik und dann Seitenumbruch - dann funktioniert es auch richtig gut. Dennoch gibt es auch hier eine leichte Verschiebung. Diese ist aber definitiv kleiner und besser „korrigierbar“ als bei meiner Original-Idee mit „lasse die Formatierung des Arbeitsblattes in Ruhe und behalte 33 Zeilen als Seitenhöhe“ Selbst bei dem 100. Wert handelt es sich ja nur um eine Verschiebung von vergleichweise 2, 3 normalen Zeilenhöhen

Screenshot Excel-Arbeitsblatt (#98 - #100)
Userbild

Screenshot der Seitenansicht (#98 - #99)
Userbild

Es kommt mir so vor, wie vor ein paar Jahren. Anruf aus einem Zimmer. Alle bearbeiten quasi dieselbe Exceldatei, alle gleiche Hardware. Am Ende stellte sich heraus, dass eine MA die Windows Skalierung unter "Anzeige" nicht auf 125% sondern 150% hatte. Und Excel nimmt so etwas ja auch übel und legt Spaltenhöhen/Breiten dann auf andere Werte fest. Änderst Du es dann.. schaut die Datei bei anderen eben verschoben aus.
Anders kann ich mir das Problem mit dem Verschieben hier auch nicht erklären. Es ist nunmal so. Excel ist kein „Grafikprogramm“. Es ist hier nur Mittel zum Zweck, um eine grafische Auswertung nach PDF zu bekommen.




Anzeige
AW: 100 Balkendiagramme sauber auf Excelseiten positionieren?
12.06.2025 16:57:43
velo
Hallo,

müssen den wirklich alle 100 Diagramme erstellt werden und nebeneinander stehen?

Wie wärs mit etwas in der Richtung:
https://www.herber.de/bbs/user/177747.xlsm

Hiermit kannst du entweder direkt in K10 die Frage auswählen zu dem das Diagramm erscheinen soll oder per Klick auf die Pfeile zwischen den Fragen wechseln.
Das ganze ist natürlich nur mal eine "technische" Vorführung, müsste dann noch etwas aufgehübscht werden.

VG
velo
Anzeige
AW: 100 Balkendiagramme sauber auf Excelseiten positionieren?
13.06.2025 09:57:59
widdi
Guten Morgen,

leider nein. Ich muss aus den Grafiken dann ein PDF-Bundle machen. Ausserdem gibt es neben den Einzelgrafiken noch weitere 4 Grafikentypen in denen diese etwas anders kombiniert dargestellt werden. Aber klar der einfachere Weg... wäre schön, wenn es ginge ;-)
AW: 100 Säulediagramme sauber auf Excelseiten positionieren?
12.06.2025 17:36:51
Beverly
Hi,

ich empfehle dir anders vorzugehen: erstelle im 1. Durchgang alle Diagramme ohne vorgegebene!! Positions- und Größenangaben und positioniere anschließend im 2. Durchgang jedes einzelne Diagramm entsprechend dem gewünschten Top und Left und stelle Breite und Höhe ein.

Bis später
Karin

Link zur Homepage: https://excel-inn.de/
Anzeige
AW: 100 Säulediagramme sauber auf Excelseiten positionieren?
13.06.2025 10:10:06
widdi
Hallo Beverly,

das könnte ich klar so einfacher machen. Aber was würde das bringen? Ich kann mir aktuell nicht vorstellen, wie ich mit einer Schleife die Positionierung nachträglich besser hinbekomme als bei der Generierung der Grafiken selber.

Das ist ja das Problem. Ich habe eine saubere Schleife mit genau vorhersagbaren Werten. Aber selbst jetzt bei der Kombinierten Lösung von Daniel und xlKIng bei der jede Zellen-Zeile eine Seite darstellt mit hartem Seitenumbruch... selbst hier gibt es eine geringe Verschiebung bei den Grafiken *grübel* Aber diese ist besser korrigierbar.
Anzeige
AW: 100 Säulediagramme sauber auf Excelseiten positionieren?
13.06.2025 14:38:25
Beverly
Hi,

du hast meinen Beitrag offensichtlich nicht verstanden - das hat nichts mit der in der Schleife korrekt vorgegebenen Größe und Position zu tun, sondern das Problem liegt einfach darin, dass die Grafik-Engine nicht in der Lage ist, gleichzeitig die Diagramme in einer anderen als in der von Excel standardmäßig angewandten Größe zu erstellen UND AUCH noch an einer anderen als der Standardposition zu positionieren. Aus diesem Grund sollte man eben in ZWEI Arbeitsschritten vorgehen, weil die Grafik-Engine damit zwischenzeitlich quasi "zurückgesetzt" wird.

Bis später
Karin

Link zur Homepage: https://excel-inn.de/
Anzeige
AW: 100 Balkendiagramme sauber auf Excelseiten positionieren?
13.06.2025 01:03:15
xlKing
Hi Widdi,

ich würde ähnlich wie Daniel mit harten Pagebreaks arbeiten. Dabei kannst du ein Diagramm pro Zeile generieren. Eine Zeile kann die maximale höhe von 409,5 Punkt annehmen. Dein Diagramm ist nur 370 Punkt hoch. Damit du einen kleinen Abstand zwischen den Diagrammen hast, kannst du als Zeilenhöhe z.B. 380 verwenden. Um Randzeichnungen des nächsten Diagramms auf dem vorherigen Blatt zu vermeiden, sollte der obere Rand mindestens 3 Punkt vom Seitenrand entfernt liegen. Probiers mal mit diesem Code:

Sub Erstellen()


Rows("1:100").RowHeight = 380

For i = 0 To 100
Dim chartObj As ChartObject
If i = 0 Then
Set chartObj = ActiveSheet.ChartObjects.Add(0, 3, 680, 370)
Else
Set chartObj = ActiveSheet.ChartObjects.Add(0, Rows(i).Top + 3, 680, 370)
End If

ActiveSheet.HPageBreaks.Add Rows(i + 1)

With chartObj.Chart
.ChartType = xlColumnClustered
.SetSourceData Source:=Range("O" & i + 2 & ":T" & i + 2)
.HasTitle = True
.ChartTitle.Text = Range("L1").Value & vbLf & Range("M1").Value
.ChartTitle.Characters(1, InStr(.ChartTitle.Text, vbLf) - 1).Font.Size = 16
.ChartTitle.Characters(InStr(.ChartTitle.Text, vbLf) + 1, Len(.ChartTitle.Text) - InStr(.ChartTitle.Text, vbLf)).Font.Size = 12

.Axes(xlCategory).TickLabels.Font.Size = 8
.Axes(xlCategory).HasTitle = True
.Axes(xlCategory).AxisTitle.Text = Range("N" & i + 2).Value
.Axes(xlCategory).CategoryNames = Range("O1:T1").Value
.Legend.Position = xlLegendPositionBottom
.Legend.Delete ' Legende wird ausgeblendet, da bei verschiedenen Farben die Legenden mit den Werten belegt werden und dann die Darstellung doppelt wäre
For j = 1 To .SeriesCollection.Count
.SeriesCollection(j).Points(6).Interior.Color = RGB(0, 206, 209) 'färbt die "Durchschnittsspalte" anders ein
' .SeriesCollection(j).Name = Range("N" & i + 2).Value ' das kann alternativ zum Achsentitel X genommen werden, wenn alle die gleiche Farbe haben
' dann wird die Legende als Spaltentitel eingesetzt
Next j
.ChartGroups(1).GapWidth = 120 ' ändert die Spaltenbreiten. Es gibt aber minimale und maximale Grenzen.
.ChartGroups(1).Overlap = 70 ' über "SeriesCollection" funktionierte die Definition nicht
End With
'Range("B" & (i * 33 + 30)).Value = "FußZeile 1"
'Range("B" & (i * 33 + 31)).Value = "FußZeile 2"
Next i

End Sub


Die Fußzeile würde ich direkt in die Fußzeile des Sheets legen. Alternativ kannst du natürlich auch vor jeder Zeile eine kleine Zeile einfügen, die du normal hoch formatierst und dort deine Fußtext reinschreibst. Ich denke das kriegst du hin.

Gruß Mr. K.
Anzeige
AW: 100 Balkendiagramme sauber auf Excelseiten positionieren?
13.06.2025 10:56:13
Daniel
Hi

Für eine gleichmäßige Ausrichtung würde ich wie von xlKing vorgeschlagen, die Diagramme im Zeilenraster ausrichten.
Allerdings würde ich die Diagramme nicht in eine Zeile packen und die Zeilenhöhe vergrößern, sondern die Zeilen auf der Standardhöhe belassen und ein einen konstanten Zeilenabstand vorgeben:

Dh der Topwert beim .Add berechnet sich nach:
Rows(i * 33 + 1).Top
Wobei 33 hier die Anzahl der Zeilen sind.

Die harem Zeilenumbrüche würde ich trotzdem verwenden.
Anzeige
AW: 100 Balkendiagramme sauber auf Excelseiten positionieren?
13.06.2025 15:26:22
widdi
Ja, Danke. Das war ja mein erster Ansatz gewesen. Dieser hatte aber ebenso nicht funktioniert. Daher hatte ich es im Weiteren versucht es mit dem Basiswert "473" zu berechnen, da ich dachte, dieser wäre eindeutiger als potentiell dynamische Zellenhöhen. Aber der Versatz war derselbe.

Bei der von Euch kombinierten Variante eben mit der "Zellenhöhe etwas größer als Grafik" ist das Verrutschen bedeutend kleiner. Bei meiner Variante hatte ich ja -2*i als Korrekturfaktor - das heisst beim 10 Diagramm war schon eine Korrektur von -20 auf die Eigenschaft .Top" notwendig.
Jetzt sind es bedeutend kleinere Werte (-26 für die 100. Diagrammpositionierung).
Beim "Durchblättern" der Seitenansicht mt den neuen Korrekturwerten merkt man den Versatz jetzt nicht mehr so krass. Dennoch überlege ich, die Korrekturfaktoren nicht für 10 zu erstellende Diagramme sondern nur für 3 zu definieren. Dann wären die Seiten tatsächlich fast deckungsgleich.. also prinzipiell... 11-13 Korrekturwert 3, 14-16 Korrekturwert 4, 17-20 Korrekturwert 5

ich habe folgendes erst mal bei mir ergänzt.




Sub Erstellen()

Rows("1:100").RowHeight = 380
ActiveSheet.PageSetup.LeftFooter = "Fußzeile 1" & Chr(10) & "Fußzeile 2"

Dim iKorrekt As Integer
iKorrekt = 0

For i = 0 To 99
Dim chartObj As ChartObject

Select Case i
Case 1 To 10
Case 11 To 20
iKorrekt = 3
Case 21 To 30
iKorrekt = 6
Case 31 To 40
iKorrekt = 9
Case 41 To 50
iKorrekt = 12
Case 51 To 60
iKorrekt = 14
Case 61 To 70
iKorrekt = 17
Case 71 To 80
iKorrekt = 20
Case 81 To 90
iKorrekt = 23
Case 91 To 99
iKorrekt = 26
Case Else
End Select


If i = 0 Then
Set chartObj = ActiveSheet.ChartObjects.Add(0, 3, 680, 370)
Else
Set chartObj = ActiveSheet.ChartObjects.Add(0, Rows(i + 1).Top + 3 - iKorrekt, 680, 370)
ActiveSheet.HPageBreaks.Add Rows(i + 1)
End If

With chartObj.Chart
........
End With
Next i
End Sub


Das ist für mich jetzt erst mal ein gangbarer Weg. Danke nochmal für die vereinte Hilfe.

Als nächstes konzentriere ich mich auf das Design der Balken. Diese sollen nämlich je nach Wert unterschiedliche Farben haben und n paar andere Definitionen. Es wird nicht langweilig
Anzeige
AW: 100 Balkendiagramme sauber auf Excelseiten positionieren?
13.06.2025 15:42:30
Daniel
Wenn du gleichmäßige Seiten willst, solltest du:.

1. Allen Zeilen die selbe Höhe zuweisen
2. Die Top Position aus einer Zeilennummer ableiten
3. Den Abstandswert (Anzahl Zeilen) etwas kleiner wählen als tastächlich Zeilen auf eine Seite passen
4. Immer harte Seitenumbrüche einfügen

Wenn du den Abstand etwas kleiner wählst notwendig, dann sicherst du ab, dass keine automatischen Seitenumbrüche mal notwendig werden, die dann für leere Seiten sorgen
Damit sollte jede Seite exakt gleich aussehen.

Gruß Daniel

Anzeige
AW: 100 Balkendiagramme sauber auf Excelseiten positionieren?
13.06.2025 01:09:46
xlKing
i muss natürlich mit 1 beginnen. eine Row(0) gibt es nicht. :-)
AW: 100 Balkendiagramme sauber auf Excelseiten positionieren?
13.06.2025 09:53:26
widdi
Guten Morgen,

Danke für den Vorschlag. Ich habe jetzt Deine und Daniels Lösung so weit kombiniert. Zwar kommt es trotz der Idee "Je Zellenzeile 1 Grafik und dann Seitenumbruch" auch zu einer Verschiebung. ABER auf Die Menge der Grafiken (100) gesehen ist das so gering, dass das leichter korrigierbar ist, als bei meiner ersten Lösung. (Screenshot im anderen Beitrag)

Ich muss jetzt nur darauf hoffen, dass die Fußnoten tatsächlich immer gleich sind. Sonst würde ich mit Hilfe eines weiteren Textfeldes diese in die Grafiken integrieren müssen.

Es ist auf jeden Fall ein faszinierendes Problem

Aktueller Quellcode


Sub Erstellen()

Rows("1:100").RowHeight = 380
ActiveSheet.PageSetup.LeftFooter = "Fußzeile 1" & Chr(10) & "Fußzeile 2"

For i = 0 To 99
Dim chartObj As ChartObject
If i = 0 Then
Set chartObj = ActiveSheet.ChartObjects.Add(0, 3, 680, 370)
Else
Set chartObj = ActiveSheet.ChartObjects.Add(0, Rows(i + 1).Top + 3, 680, 370) 'i+1 - das Problem "es gibt keine 0. Zeile" umschiffen
ActiveSheet.HPageBreaks.Add Rows(i + 1)
End If


With chartObj.Chart
.ChartType = xlColumnClustered
.SetSourceData Source:=Range("O" & i + 2 & ":T" & i + 2)
.HasTitle = True
.ChartTitle.Text = Range("L1").Value & vbLf & Range("M1").Value
.ChartTitle.Characters(1, InStr(.ChartTitle.Text, vbLf) - 1).Font.Size = 16
.ChartTitle.Characters(InStr(.ChartTitle.Text, vbLf) + 1, Len(.ChartTitle.Text) - InStr(.ChartTitle.Text, vbLf)).Font.Size = 12

.Axes(xlCategory).TickLabels.Font.Size = 8
.Axes(xlCategory).HasTitle = True
.Axes(xlCategory).AxisTitle.Text = Range("N" & i + 2).Value
.Axes(xlCategory).CategoryNames = Range("O1:T1").Value
.Legend.Position = xlLegendPositionBottom
.Legend.Delete ' Legende wird ausgeblendet, da bei verschiedenen Farben die Legenden mit den Werten belegt werden und dann die Darstellung doppelt wäre
For j = 1 To .SeriesCollection.Count
.SeriesCollection(j).Points(6).Interior.Color = RGB(0, 206, 209) 'färbt die "Durchschnittsspalte" anders ein
' .SeriesCollection(j).Name = Range("N" & i + 2).Value ' das kann alternativ zum Achsentitel X genommen werden, wenn alle die gleiche Farbe haben
' dann wird die Legende als Spaltentitel eingesetzt
Next j
.ChartGroups(1).GapWidth = 120 ' ändert die Spaltenbreiten. Es gibt aber minimale und maximale Grenzen.
.ChartGroups(1).Overlap = 70 ' über "SeriesCollection" funktionierte die Definition nicht
End With
Next i

End Sub
Anzeige

Forumthreads zu verwandten Themen

Anzeige