Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
456to460
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
456to460
456to460
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Diagramm dynamisch per Variablenübergabe zeichnen

Diagramm dynamisch per Variablenübergabe zeichnen
22.07.2004 15:12:50
Tobias
Hallo
Ich möchte mittels einer VBA Prozedur mehrere Diagramm zeichnen. Dabei sollen die Diagrammbereiche mittels Variablen übergeben werden. Bei der Festlegung des Diagramm-Datenfeldes klappt das auch bereits:
ActiveChart.SetSourceData Source:=Sheets("Energie_Strom").Range(aBereich(0), aBereich(test)), PlotBy:=xlColumns
ABER, nur wenige Zeilen drunter verzweifle ich an der Beschriftung der x-Achse, die sich ebenfalls aus einer Variable ergeben soll.
ActiveChart.SeriesCollection(1).XValues = "=Energie_Strom!R8C3:R12C3"
So funktioniert es, ist aber eben nicht dynamisch. Wenn ich nun aber versuche, eine Variable in der Form ' "=Energie_Strom!" & variable' einzusetzen bekomme ich die Fehlermeldung:
"Die XValues Eigenschaft des Series Objekts kann nicht festgelegt werden".
Folglich funktioniert mein Ansatz wohl nicht. Kennt jemand einen besseren?
Danke
Tobias

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Diagramm dynamisch per Variablenübergabe zeichnen
Ulf
Lad mal ein Beispiel hoch.
Ulf
AW: Diagramm dynamisch per Variablenübergabe zeichnen
22.07.2004 16:30:44
Volker
Hallo Tobias,
Ich hab eine chart mit Temperaturen über der Zeit in die ich reinzoomen kann.
minwert/maxwert werden später für die Skalierung der y-Achse verwendet:
minwert = 5 * Int(WorksheetFunction.Min(Sheets("data").Range("B" & start_zeile & ":AO" & end_zeile)) / 5)
maxwert = 5 * (Int(WorksheetFunction.Max(Sheets("data").Range("B" & start_zeile & ":AO" & end_zeile)) / 5) + 1)
ActiveSheet.ChartObjects(1).Activate
daten = Sheets("data").Cells(1, 1).Address(0, 0) & ":" & Sheets("data").Cells(1, channels + 1).Address(0, 0) _
& ", " & Sheets("data").Cells(start_zeile, 1).Address(0, 0) & ":" & Sheets("data").Cells(end_zeile, channels + 1).Address(0, 0)
Application.ScreenUpdating = False
ActiveChart.SetSourceData Source:=Sheets("data").Range(daten), _
PlotBy:=xlColumns

With ActiveChart.Axes(xlValue)
.MinimumScale = minwert
.MaximumScale = maxwert
' .MinorUnitIsAuto = True
' .MajorUnit = 5
' .Crosses = xlAutomatic
' .ReversePlotOrder = False
' .ScaleType = xlLinear
' .DisplayUnit = xlNone
End With

ActiveSheet.Cells(1, 1).Select
Application.ScreenUpdating = True
End Sub
Zum Verständnis:
start_zeile/end_zeile werden über eine Zeiteingabe in Minuten in eine inputputbox berechnet. Betrug die Meßperiode z.B. 30 sec, wenn also alle 30 sec. ein Wert eingetragen ist, liefert eine Eingabe von 10min als start_zeile Zeile20 (10min/30sec=20)
dito die end_zeile: z.B. 40min/30sec=80
Ich hab also einen range, dessen größten und kleinsten Wert ich berechne.
Die Variable Daten ergibt ein range-Objekt, das nun aus dem Quelldatenbereich für die
Datenreihennamen und dem Quelldatenbereich für die Datenreihen selbst besteht.
also in der Art daten=("a1:m1","a20:m80"). Daten wird dann mit
ActiveChart.SetSourceData Source:=....... an die chart übergeben.
Dann wird nur noch die y-Achse skaliert.
Das große Problem war, einen range variabel zu gestalten.
Bei der Zeilennr. kein Problem range("A" & start_zeile & ":B" & end_zeile)
Die Spaltenbuchstaben kann man leider nicht einfach ersetzen.
Im Archiv hab ich die Lösung gefunden:
range(cells(1,1).address(0,0):cells(5,5).address(0,0)) ergibt z.B. =range("A1:E5").
Ich hoffe Du blickst da durch und ich konnte Dir helfen
Gruß
Volker
Anzeige
AW: Diagramm dynamisch per Variablenübergabe zeichnen
Herbert
Hallo Tobias!
Ich habe an einem simplen Beispiel das nachgestellt, von dem ich glaube, das du das willst. Bei mir hat es funktioniert.
Ich konnte den von dir geschilderten Fehler provuzieren, wenn ich in der Zuweisung
ActiveChart.SeriesCollection(1).XValues = "=Energie_Strom!" & variable
einen Blattnamen verwendete, den es nicht gab, bzw in 'variable' ein falscher Bezug enthalten war.
Vielleicht hilft dir das bei der Fehlersuche.
Herbert
Meine Prozedur (Ergänzung)
22.07.2004 17:06:57
Tobias
Hallo nochmal!
Wie von Ulf erbeten, hier meine Prozedur. Es sind noch keine Erläuterungen drin und der Stil ist vermutlich auch nicht perfekt. Immerhin tut es aber was es soll, abgesehen vom eigentlichen Erstellen der Diagramme.
Vorweg nochmal zur Erklärung. In einem Arbeitsblatt befinden sich mehrere Tabellen, auf die die Prozedur automatisch zugreift. Die Namen der Tabellen sind in der Spalte A hinterlegt. Die Prozedur speichert diese Namen nun der Reihe nach in der Variable strTabelle und springt entsprechend auf dem Arbeitsblatt zu den einzelnen Tabellen.
In diesen bestimmt die Prozedur nun zunächst Breite und Höhe der Tabelle und markiert danach einzelne Spalten. Das Kriterium für die Markierung ist ein im Arbeitsplatt über die entsprechende Spalte gesetztes "x". So kann der Benutzer festlegen, welche Spalten später Teil des Diagramms werden sollen und welche nicht. Meine Vorgabe für die Prozedur war die, dass eine beliebige Anzahl Tabellen mit beliebig vielen Spalten und Zeilen auf demselben Arbeitsplatt mit immer derselben Prozedur verarbeitet werden kann.
(die Tabellen beginnen alle in Zeile 8, darum wird intTabelle_n zu Anfang auf 8 gesetzt)

Sub diagramm_zeichnen()
Dim strTabelle As String         'Namensvariable zum Abruf der per Namensfeld benannten Tabellen
Dim intTabelle_n As Integer      'Zählervariable - Anzahl der zu übertragenden Tabellen
Dim intSpalte As Integer         'Zählervariable - Tabellenspalten
Dim intZeile As Integer          'Zählervariable - Tabellenzeilen
Dim intI As Integer              'allgemeine Zählervariable
Dim intZaehler As Integer        'definiert das Maximum der Zählervariable intI
Dim dblEnde_Zeile As Double
Dim aBereich(6) As Variant
Dim test As Variant
intTabelle_n = 8
Do While intTabelle_n <> 0
strTabelle = Range("A" & intTabelle_n).Value
intI = 1
intZeile = 4
If strTabelle = "" Then
intTabelle_n = 0
Exit Do
Else: intTabelle_n = intTabelle_n + 1
End If
intSpalte = Range(strTabelle).Column
intZaehler = Cells(Rows.Count, intSpalte - 1).End(xlUp).Row - 6
For intI = 1 To intZaehler
If Cells(intZeile, intSpalte).Value = "x" Then
dblEnde_Zeile = Cells(Rows.Count, intSpalte).End(xlUp).Row
Range(Cells(intZeile + 3, intSpalte), Cells(dblEnde_Zeile, intSpalte)).Select
aBereich(intI - 1) = Selection.Address
intSpalte = intSpalte + 1
test = intI - 1
ElseIf Cells(intZeile, intSpalte).Value = 0 Then
intSpalte = intSpalte + 1
End If
Next
Loop 

Ab hier ist alles bislang Improvisation. An dieser Stelle kann das Erstellen der Diagramme natürlich nicht stehen bleiben, doch wenn man versucht nur eine einzelne Tabelle in ein Diagramm zu verarbeiten funktioniert es. Und mir geht es ja zunächst einmal um die Funktion an sich.
Ich möchte die X-Achse der Diagramme mit der ersten Spalte der Tabellen füllen. In dieser ersten Spalte stehen immer Jahreszahlen. Das bedeutet, ich muss irgendwie einen relativen, variablen Bezug auf die erste Spalte der Tabellen herstellen. Und genau daran hakts im Moment.
Setzt man den Wert von ActiveChart.SeriesCollection(1) gleich denen von SeriesCollection 2 und 3, funktioniert es. Dann habe ich die Jahresangaben in der Tabelle als X Werte des Diagramms. Aber eben nur deswegen, weil ein fester Bezug auf die erste Spalte der ersten Tabelle des Arbeitsblattes besteht. Darum die ? hinter SeriesCollection(1).
Charts.Add
ActiveChart.ChartType = xlLine
ActiveChart.SetSourceData Source:=Sheets("Energie_Strom").Range(aBereich(0), aBereich(test)), PlotBy:=xlColumns
'ActiveChart.SeriesCollection(1).Delete
ActiveChart.SeriesCollection(1).XValues = "=Energie_Strom!" + ?
'ActiveChart.SeriesCollection(2).XValues = "=Energie_Strom!R8C3:R12C3"
'ActiveChart.SeriesCollection(3).XValues = "=Energie_Strom!R8C3:R12C3"
ActiveChart.Location Where:=xlLocationAsNewSheet
ActiveChart.HasLegend = True
ActiveChart.Legend.Select
Selection.position = xlTop
Sheets("Energie_Strom").Select
End Sub

Das alles ist viel komplizierter zu erklären als es eigentlich ist. Ich hoffe irgendwer konnte mir folgen. Falls nicht, könnte ich höchstens noch die gesamte Arbeitsmappe inklusive der Arbeitsblätter hier reinstellen.
besten Dank soweit
Tobias
Anzeige
AW: Meine Prozedur (Ergänzung)
22.07.2004 19:24:21
Björn
Hallo Tobias,
schau Dir mal dieses Beispiel an:

Sub test()
reihe1 = 1
reihe2 = 4
spalte1 = 1
spalte2 = 1
ActiveChart.SeriesCollection(1).XValues = "=Tabelle2!R" & reihe1 & "C" & spalte1 & ":R" & reihe2 & "C" & spalte2
'obiger Aufruf ergibt das gleiche wie:
'ActiveChart.SeriesCollection(1).XValues = "=Tabelle2!R1C1:R4C1"
End Sub

Ich hoffe das hilft Dir weiter.
Gruß
Björn
Ja, tuts. Besten Dank!
22.07.2004 22:07:16
Tobias
hat geklappt!
Danke für die Rückmeldung - o. T.
23.07.2004 20:12:41
Björn

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige