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

Diagrammersterlling mit variabler Adressierung

Diagrammersterlling mit variabler Adressierung
15.11.2023 12:46:29
reiner
Hallo Leute,

mit folgendem Programmcode werden die Werte der X-Achse in das neue Diagramm eingefügt:
ActiveChart.SetSourceData Source:=Range("'Stromverbrauch 2023'!$A$109:$A$139")


Nun will ich die Adressierung variabel gestalten, allerdings ist dieser Versuch bislang fehlgeschlagen:
ActiveChart.SetSourceData Source:=Range("'Stromverbrauch 2023'!(Cells(ZeileMonatsErster,1), Cells(ZeileMonatsletzter, 1))")


Wie müsste der funktionierende Programmcode formuliert sein?

mfg
reiner

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Diagrammersterlling mit variabler Adressierung
15.11.2023 13:08:13
Beverly
Hi reiner,

versuche es mal so:

Dim wksTab As Worksheet

Dim rngBereich As Range
Set wksTab = Worksheets("Stromverbrauch 2023")
Set rngBereich = wksTab.Range(wksTab.Cells(ZeileMonatsErster, 1), wksTab.Cells(ZeileMonatsletzter, 1))
ActiveChart.SetSourceData Source:=rngBereich


Bis später
Karin

Link zur Homepage: https://excel-inn.de/
AW: Diagrammersterlling mit variabler Adressierung
15.11.2023 14:40:14
reiner
hallo Beverly,

ich habe eine abgespeckte Beispieldatei hochgeladen um das Problem zu verdeutlichen
https://www.herber.de/bbs/user/164307.xlsm

Ich habe deinen Vorschlag bei allen 5 Datenreihen (Spalten C - G) umgesetzt.
Wenn ich nun in der UF die 5 CheckBoxen anklicke soll das Diagramm alle 5 Datenreihen im Diagramm über den Zeitverlauf (Monat Oktober) darstellen.
Es wird jedoch nur 1 Datenreihe anstatt 5 Datenreihen dargestellt!

Wenn jedoch der Original Programmcode aktiv ist (Zeilen: 17, 44, 58, 72, 86, 100) werden 5 Datenreihen wie gewünscht dargestellt.

Es ist wirklich schade dass dein Vorschlag für die variable Zellzuordnung hier nicht zum gleichen Ergebnis führt wie mit der festen Zellzuordnung.
Mit der variablen Zellzuordnung will ich erreichen dass jeder Monat eines Jahrgangs angewählt und der Kurvenverlauf im Diagramm dargestellt werden kann.
Was kann hier noch das Problem sein?

Eine Zusatzfrage: Warum wird bei mehr als 2 angewählten Checkboxen grundsätzlich eine NICHT gewählte, NICHT vorhandene Datenreihe aufgeführt? Lässt sich dieses Verhalten unterbinden?

mfg
reiner
Anzeige
AW: Diagrammersterlling mit variabler Adressierung
15.11.2023 15:38:24
reiner
Hallo Beverly,

ich habe wie schon vor meiner ursprünglichen Anfrage an dieses Forum weiterhin nach einer Lösung recherchiert. Leider habe ich diesen nachfolgenden Lösungsansatz erst jetzt entdeckt, getestet und festgestellt, das damit die Darstellung von bis zu 5 Datenreihen variabel realisierbar ist:
ActiveChart.SeriesCollection(AnzDatenreihen).Values = Wks.Range(Wks.Cells(ZeileMonatsErster, 3), Wks.Cells(ZeileMonatsLetzter, 3))


Hier beispielhaft ein Teil des angepassten Programmcodes aus der Besispieldatei:

'##########################################################################

If frmBeenden.chk1.Value = True Then
If SeriesAdd = 1 Then 'Verbrauch
ActiveChart.Axes(xlValue).Select
ElseIf SeriesAdd > 1 Then
ActiveChart.SeriesCollection.NewSeries
End If
AnzDatenreihen = ActiveChart.SeriesCollection.Count - 1
If AnzDatenreihen = 0 Then AnzDatenreihen = 1
ActiveChart.SeriesCollection(AnzDatenreihen).Name = "='Stromverbrauch 2023'!$C$2"
ActiveChart.SeriesCollection(AnzDatenreihen).Values = Wks.Range(Wks.Cells(ZeileMonatsErster, 3), Wks.Cells(ZeileMonatsLetzter, 3))
End If
'##########################################################################
Was hälst du von diesem Lösungsansatz? Es scheint zu funktioniefren.

Die Zusatzfrage aus meiner Rückmeldung von 14:40 Uhr lasse ich aber noch offen

viele Grüße
reiner
Anzeige
AW: Diagrammersterllung mit variabler Adressierung
15.11.2023 17:49:34
Beverly
Hi reiner,

ich habe im Modul "DiagrammErstellen" eine Public-Variable deklariert - Public arrReihen(). Im Code deines CommandButtons "cmdDiagramm" werden auf diese Variable die Spaltennummern geschrieben, in denen sich die anzuzeigenden Daten befinden, wenn die betreffende CheckBox ausgewählt ist:

Private Sub cmdDiagramm_Click()

'**************************************************
Dim ctrElement As Control
Dim intZaehler As Integer
' Schleife über alle Steuerelemente des UF
For Each ctrElement In Me.Controls
' die linken 3 Buchstaben des Namen sind "chk"
If Left(ctrElement.Name, 3) = "chk" Then
' CheckBox ist aktiviert!!
If ctrElement Then
' Array redimensionieren
ReDim Preserve arrReihen(0 To intZaehler)
arrReihen(intZaehler) = Right(ctrElement.Name, 1) * 1 + 2 '== Spaltennummer abgeleitet aus dem Zusatz zu "chk" ins Array schreiben
intZaehler = intZaehler + 1
End If
End If
Next ctrElement
'**************************************************
DiagrammGenrieren
frmBeenden.chk1.Value = False
frmBeenden.chk2.Value = False
frmBeenden.chk3.Value = False
frmBeenden.chk4.Value = False
frmBeenden.chk5.Value = False
End Sub


Daraus ergibt sich dann folgender Code für das Erstellen des Diagramms:

Function DiagrammGenrieren()

Dim intReihe As Integer
Application.ScreenUpdating = False
Set WksTab = Worksheets("Stromverbrauch 2023")
ZeileMonatsErster = 105
ZeileMonatsLetzter = 135
With WksTab
.Unprotect
' Diagramm(e) vorhanden dann alle löschen
If .ChartObjects.Count > 0 Then .ChartObjects.Delete
frmBeenden.cmdDiagramm.Enabled = False
' Diagramm hinzufügen mit den Dimensionen 0
Set Dia = .ChartObjects.Add(0, 0, 0, 0)
With Dia
' Schleife über alle Einträge im Array
For intReihe = 0 To UBound(arrReihen())
' neue Datenreihe erstellen
With .Chart.SeriesCollection.NewSeries
' Name aus Zeile 2, Spaltennummer aus Array
.Name = WksTab.Cells(2, arrReihen(intReihe))
' Wertebereich zuweisen, Spaltennummer aus Array
.Values = WksTab.Range(WksTab.Cells(ZeileMonatsErster, arrReihen(intReihe)), WksTab.Cells(ZeileMonatsLetzter, arrReihen(intReihe)))
End With
Next intReihe
' der 1. Datenreihe den Achsenbeschriftungsbereich zuweisen
' ist bei einem Liniendiagramm nur bei 1 Datenreihe erforderlich
.Chart.SeriesCollection(1).XValues = WksTab.Range(WksTab.Cells(ZeileMonatsErster, 1), WksTab.Cells(ZeileMonatsLetzter, 1))
.Name = "Diagramm 1"
' Diagrammtyp 3DLinie zuweisen
.Chart.ChartType = xl3DLine
' Größenwerte dem Diagramm zuweisen
.Left = 100
.Width = 1000
.Top = 1700
.Height = 600
' Beschriftungsformat Horizontalachse anpassen
.Chart.Axes(xlCategory).TickLabels.NumberFormat = "ddd. dd.mm.yyyy"
End With
.Protect
End With
End Function


Bis später
Karin

Link zur Homepage: https://excel-inn.de/
Anzeige
AW: Diagrammersterllung mit variabler Adressierung
15.11.2023 18:40:20
reiner
Hallo Beverly,

mit deinem aktuellen Vorschlag muss ich mich zunächst auseinanderstzen. Auf Anhieb funktioniert der Code bei mir noch nicht, da mache ich morgen weiter

erst einmal vielen Dank
reiner

AW: Diagrammersterllung mit variabler Adressierung
16.11.2023 12:05:00
reiner
Hallo Beverly,

ich habe mir deine Lösung genauer angeschaut und bin begeistert. Die Frage bezgl. der zusätzlichen angezeigten (tatsächlich nicht vorhandenen) Datenreihen in der Legende hat sich nun auch erübrigt.

Eine Frage möchte ich noch loswerden:
Wie kann ich das Diagramm in den Bereich der jeweils ersten Zeile des angezeigten Monats (ZeileMonatsErster) auf dem Tabellenblatt platzieren? In der derzeitigen Version
wird dem Diagramm eine feste Position zugewiesen:
Set Dia = .ChartObjects.Add(0, 0, 0, 0)

.Left = 100
.Width = 1000
.Top = 1700
.Height = 600


Das Tabellenblatt enthält aber auch Daten aus den Monaten Januar bis Dezember; da wäre es schön wenn das Diagramm im Bereich des angezeigten Monats platziert wird.

vielen Dank für die bisherige Lösung
reiner
Anzeige
AW: Diagrammerstellung mit variabler Adressierung
16.11.2023 12:25:40
Beverly
Hi reiner,

ich habe 1 Codezeile angepasst und 1 Codezeile ergänzt (sind gekennzeichnet):

    With WksTab

.Unprotect
' Diagramm(e) vorhanden dann alle löschen
If .ChartObjects.Count > 0 Then .ChartObjects.Delete
frmBeenden.cmdDiagramm.Enabled = False
' Diagramm hinzufügen mif den Dimensionen 0
Set Dia = .ChartObjects.Add(0, 0, 0, 0)
With Dia
' Schleife über alle Einträge im Array
For intReihe = 0 To UBound(arrReihen())
' neue Datenreihe erstellen
With .Chart.SeriesCollection.NewSeries
' Name aus Zeile 2, Spaltennummer aus Array
.Name = WksTab.Cells(2, arrReihen(intReihe))
' Wertebereich zuweisen, Spaltennummer aus Array
.Values = WksTab.Range(WksTab.Cells(ZeileMonatsErster, arrReihen(intReihe)), WksTab.Cells(ZeileMonatsLetzter, arrReihen(intReihe)))
End With
Next intReihe
' der 1. Datenreihe den Achsenbeschriftungsbereich zuweisen
' ist bei einem Liniendiagramm nur bei 1 Datenreihe erforderlich
.Chart.SeriesCollection(1).XValues = WksTab.Range(WksTab.Cells(ZeileMonatsErster, 1), WksTab.Cells(ZeileMonatsLetzter, 1))
.Name = "Diagramm 1"
' Diagrammtyp 3DLinie zuweisen
.Chart.ChartType = xl3DLine
' Größenwerte dem Diagramm zuweisen
.Left = 100
.Width = 1000
' Oberkante an Zeile ausrichten
.Top = WksTab.Rows(ZeileMonatsErster).Top '== Codezeile angepasst
.Height = 600
' Beschriftungsformat Horizontalachse anpassen
.Chart.Axes(xlCategory).TickLabels.NumberFormat = "ddd. dd.mm.yyyy"
End With
' in Spalte A zur 2. Zeile oberhalb der entsprechenden Daten scrollen
Application.Goto reference:=.Cells(ZeileMonatsErster - 2, 1), Scroll:=True '== Codezeile ergänzt
End With


Bis später
Karin

Link zur Homepage: https://excel-inn.de/
Anzeige
AW: Diagrammerstellung mit variabler Adressierung
16.11.2023 13:48:09
reiner
Hallo Beverly,

super,

ich trau mich kaum noch eine weitere Frage zu formulieren.

In meiner bisherigen Version habe ich über eine IF-Abfrage die Diagrammform ausgewählt:
         If frmBeenden.opt1Dia.Value = True Then

' Diagrammtyp Säulen zuweisen
ActiveChart.ChartType = xlCylinderCol
ElseIf frmBeenden.opt2Dia.Value = True Then
' Diagrammtyp 3DLinie zuweisen
ActiveChart.ChartType = xl3DLine
End If

Dieser Programmcode lässt sich in vorhandener Version aber nicht in die Function DiagrammGenerieren() integrieren. Würdest mir bitte noch diesen Programmcode angepasst in Function DiagrammGenerieren() integrieren?

danke für die bisherige Unterstützung
reiner
Anzeige
AW: Diagrammerstellung mit variabler Adressierung
16.11.2023 14:15:47
Beverly
Hi reiner,

du kannst den Typ doch an das Makro zur Diagrammerstellung übergeben. Ersetze dazu im Code für deinen CommandButton im UserForm die Zeile

DiagrammGenrieren


durch diesen Code

    ' Übergabe des Diagrammtyps

If opt1Dia Then
' 3D-Zylinder
DiagrammGenrieren xlCylinderCol
Else
' 3D-Linie
DiagrammGenrieren xl3DLine
End If


Und deine Function_DiagrammGenrieren() muss dann den Parameter übernehmen:

Function DiagrammGenrieren(lngTyp As Long)


Außerdem änderst du diese Codezeile in der Function

            ' Diagrammtyp 3DLinie zuweisen

.Chart.ChartType = xl3DLine


in diese

            ' Diagrammtyp zuweisen

.Chart.ChartType = lngTyp


Bis später
Karin

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

Anzeige
AW: Diagrammerstellung mit variabler Adressierung
16.11.2023 15:05:16
reiner
Hallo Beverly,

mein Fragenkatalog ist damit abgearbeitet
wenn weitere Probleme auftauchen melde ich mich erneut

danke für alles
reiner

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige