Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1944to1948
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

VBA Säulendiagramm

VBA Säulendiagramm
25.08.2023 16:43:02
Kevin
Hallo Ihr Lieben,

ich habe leider ein Problem mit meinem VBA Code und bekomme es einfach nicht gelößt. Die originale Datei ist recht groß, daher habe ich es mal abstrahiert und in einer kleineren zusammengefasst.

Der Datensatz ist recht einfach. In 4 Zeilen stehen von oben nach unten die Datenreihen "Konzept", "Anfangsinvestitionen", "Jährliche Kosten" und "Amortisationszeit". Diese werden mittels Makro eingelesen und in ein Säulendiagramm übertragen. Auf der X-Achse die Konzepte 1-X. Auf Y1 Euro und auf Y2 die Jahre. Eingelesen und aufgetragen bekomme ich die Daten, allerdings überlappen sich die Datensätze und das bekomme ich einfach nicht behoben..

Es sollte mit
 .ChartType = xlColumnClustered

funktionieren, tut es aber leider nicht.

Ich habe das ganze Diagramm auf X-Weisen versucht zu erstellen und einzulesen, aber es möchte einfach nicht klappen :-(

Ich freue mich sehr über Eure Hilfe und herzlichen Dank im Voraus.
Liebe Grüße
Kevin

https://www.herber.de/bbs/user/162482.xlsm

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

Betreff
Datum
Anwender
Anzeige
VBA Diagramm gestapelte Säulen mit 2 Achsen
25.08.2023 18:29:34
Beverly
Hi Kevin,

die Datenreihen der Sekundärachse werden standardmäßig niemals an die Datenreihen der Primärachse "hinten angestellt" sondern stets an dieselbe Position, bzw. in dieselbe Rubrik. Sie liegen aber immer vor denen der Primärachse, d.h. sie verdecken diese Säulen wenn sie gleich groß oder größer sind.
Deshalb muss man zusätzliche Dummy-Datenreihen verwenden, die die Säulen entsprechend innerhalb der Rubriken verschieden. Auf der Primärachse benötigt man 1 zusätzliche Dummy-Datenreihe, damit diese die anderen beiden Säulen nach links verschiebt. Dasselbe Prinzip trifft auf die Säulen der Sekundärachse zu, nur muss man die Dummy-Datenreihe(n) dort der eigentlichen Datenreihe voranstellen, damit diese nach rechts verschoben wird. Auf der Sekundärachse sind es außerdem 2 Dummy-Datenreihen, da ja 1 Säule (Datenreihe) angezeigt werden soll. Das Diagramm muss also (in diesem Fall) dieselbe Anzahl an Datenreihen auf beiden Achsen haben, d.h. es muss aus 3 Datenreihen auf der Primär- und 3 Datenreihen auf der Sekundärachse bestehen, wobei die Säulen auf der Sekundärachse "normalerweise" die Säulen auf der Primärachse direkt verdecken würden - da die beiden ersten Datenreihen aber keine Werte haben, werden sie Säulen nicht dargestellt und nur die 3. Säule mit den gewünschten Werten ist sichtbar.

Natürlich muss man am Ende dann noch die überflüssigen Legendeneinträge löschen.

Sub CreateColumnChartWithSecondaryAxis()

Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Tabelle1") ' Arbeitsblattnamen anpassen

Dim chart As ChartObject
Set chart = ws.ChartObjects.Add(Left:=100, Width:=375, Top:=75, Height:=225)

With chart.chart
.ChartType = xlColumnClustered

' X-Achse benennen
.Axes(xlCategory).HasTitle = True
.Axes(xlCategory).AxisTitle.Text = "Nummerierung"

' PrimŠre Y-Achse formatieren
With .Axes(xlValue)
.HasTitle = True
.AxisTitle.Text = "Euro [Û]"
End With

'Datenreihe 1
With .SeriesCollection.NewSeries
.Name = "Anfangsinvest"
.Values = ws.Range("B2:D2")
End With

'Datenreihe 2
With .SeriesCollection.NewSeries
.Name = "JŠhrliche Kosten"
.Values = ws.Range("B3:D3")
End With

' eine zusätzliche Datenreihe erstellen um die andere beiden nach links zu verschieben
.SeriesCollection.NewSeries

Dim intZaehler As Integer
' 3 neue Datenreihen auf der Sekundärachse erstellen
For intZaehler = 1 To 3
With .SeriesCollection.NewSeries
.AxisGroup = xlSecondary
End With
Next intZaehler

' der letzten Datenreihe Name, Werte und Farbe Grau zuweisen, da diese Säule angezeigt werden soll
With .SeriesCollection(.SeriesCollection.Count)
.Name = "Amortisationszeit"
.Values = ws.Range("B4:D4")
.Interior.Color = 10921638
End With

' überflüssige Legenden-Einträge löschen
For intZaehler = .SeriesCollection.Count To 1 Step -1
Select Case .SeriesCollection(intZaehler).Name
Case "Amortisationszeit", "JŠhrliche Kosten", "Anfangsinvest"
Case Else
.Legend.LegendEntries(intZaehler).Delete
End Select
Next intZaehler

' 2. Y-Achse bennen
With .Axes(xlValue, xlSecondary)
.HasTitle = True
.AxisTitle.Text = "Amortisationszeit"
End With
End With
End Sub


Übrigens: Datenreihen, die auf die Primärachse gezeichnet werden, muss man die Achse nicht zuweisen, da die Primärachse die Standardachse ist.

Bis später
Karin

https://excel-inn.de/
Anzeige
VBA Diagramm gestapelte Säulen mit 2 Achsen
27.08.2023 14:19:26
Kevin
Hallo Beverly,

vielen vielen herzlichen Dank! Das funktioniert einwandfrei und mit deiner klasse Eklärung konnte ich die Vorgehensweise auch verstehen! :-)

Zwei kleine Probleme, die ich einfach nicht gelößt bekomme. Das Diagramm passt sich stets an weitere Datensätze an, die kontinuierlich hinzugefügt werden.
Bis dato wird jedes mal ein neues Diagramm erstellt, sodass ich die am Ende alle übereinander liegen habe..

Ich habe versucht das Diagramm zu bennen und bevor ein Neues erstellt wird zu prüfen ob bereits eins existiert und dieses daraufhin zu verwenden:
    

On Error Resume Next
If Not Overview.ChartObjects("Konzeptvergleich") Is Nothing Then 'Overview ist an dieser Stelle mein Hauptworksheet
Set chtObj = Overview.ChartObjects("Konzeptvergleich") 'Existierendes zuweisen, wenn Chart "Konzeptvergleich" existiert
Else
Set chtObj = Overview.ChartObjects.Add(Left:=175, Width:=350, Top:=210, Height:=185)
chtObj.Name = "Konzeptvergleich"
End If
On Error GoTo 0


allerdings funktioniert dies nicht und hat mir beim rumprobieren Excel auch bereits etliche mal abstürzen lassen.

Hast du vielleicht eine Idee wo mein Denkfehler liegt? Die Doku zum ChartObject war leider keine wirkliche Hilfe..

Liebe Grrüße und einen schönen Sonntag
Kevin
Anzeige
Diagramme löschen
27.08.2023 14:45:43
Beverly
Hi Kevin,

weshalb löscht du nicht einfach das vorhandene Diagramm wenn du es jedesmal neu erstellst? Zu viele überflüssige Diagramme belasten doch die Arbeitsmappe unnötig.
Mit folgendem Code werden alle vorhandenen Diagramme gelöscht:

    If Worksheets("Tabelle1").ChartObjects.Count > 0 Then Worksheets("Tabelle1").ChartObjects.Delete



Bis später
Karin

https://excel-inn.de/
Diagramme löschen
27.08.2023 16:14:11
Kevin
Hey Karin,

vielen Dank! Das ist so natürlich viel einfacher, funktioniert perfekt!

Eine letzte Frage hätte ich noch - kann es sein, dass man Werte, die mittels VBA in eine Zelle "programmiert" wurden, nicht kopieren kann?
Ich habe in meinem Tabellenblatt "Übersicht" etliche Werte, die ich aus unterschiedlichen anderen Tabellenblättern rüberkopiere, bzw. da die meisten Werte dynamisch sind, habe ich mittels VBA auf dem "Übersicht"-Tabellenblatt Verweisformeln in die einzelnen Zellen eingefügt. Dieses Übertragen funktioniert auch einwandfrei. Jetzt möchte ich allerdings eine Zelle, die einen Wert über einen Verweis erhält in einen statischen Wert umwandeln, sodass dieser ab dem Zeitpunkt nicht mehr automatisch angepasst wird.

Ich habe das Ganze auch hier wieder über verschiedene Weisen probiert
   

'Einfach mit
Overview.Range("B75").Value = Overview.Range("B71").Value

'oder bspw. mittels Copy&Paste
Overview.Range("B70:B73").Copy

Einfügen der Werte und Formatierung in Zellen B74-B77
Overview.Range("B74:B77").PasteSpecial Paste:=xlPasteValuesAndNumberFormats
Application.CutCopyMode = False ' Löscht die Kopierauswahl


allerdings alles erfolglos.

Ich habe auch alle möglichen Werte versucht zu kopieren und Werte, die ich händisch eintrage, lassen sich einwandfrei kopieren. Ebenfalls auch Werte, die ich mit VBA aus einer z.B. Zählvariable in eine Zelle geschrieben habe lassen sich kopieren.

Bei beiden Alternativen oben, die Werte aus VBA-Verweisen kopieren sollen wird lediglich der Wert 0 in die Zielfelder eingetragen.

Vielen Dank und liebe Grüße
Kevin
Anzeige
AW: Diagramme löschen
27.08.2023 17:53:40
Beverly
Hi Kevin,

beide Varianten sollten eigentlich funktionieren. Es spielt keine Rolle, ob du in eine Zelle Werte direkt einträgst oder per Formel oder per VBA direkt oder die Formel per VBA.

Mit welchem Code trägst du denn die Formeln ein?

Bis später
Karin

https://excel-inn.de/
Diagramme löschen
01.09.2023 10:51:29
Kevin
Hey Karin,

habe die Art und Weise jetzt umgestellt, also bin das Problem jetzt einfach umgangen. Hatte es auch in einem "frischen" Excelblatt versucht, da hat es auch funktioniert, also weiß ich nicht, das da nicht funktioniert hat.

Ganz herzlichen Dank für deine Hilfe! Wirklich ganz dickes Dankeschön und großes Lob für die verständlichen Erklärungen! :-)

Liebe Grüße
Kevin
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige