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

SeriesCollection.Value über VBA

Forumthread: SeriesCollection.Value über VBA

SeriesCollection.Value über VBA
19.12.2007 11:39:00
Norbert
Hallo Forum,
ich habe auf einem Tabellenblatt (RendVola_01) ein Basisdiagramm (xy) erstellt. Reihe 1 (SeriesCollection(1)) enthält x und y-Werte von ca. 10.000 Fonds. Reihe 2 (SeriesCollection(2)) enthält die x und y-Werte eines bestimmten Fonds. Die Werte der Fonds befinden sich auf dem Tabellenbaltt, welches in der Variablen Peergroup gespeichert ist.
Ich möchte gerne 10 verschiedene Diagramme erstellen, wobei jedes Diagramm als gif-Datei gespeichert werden soll. Das erste Diagramm wird erstelt und gespeichert und beim zweiten Diagramm bricht das Makro mit einer Fehglermeldung ab: Methode SeriesCollection fehlgeschlagen. Grund: im Dagramm befindet sich nur noch eine Reihe, die zweite wurde gelöscht.
Wo liegt der Fehler?

Sub Diagramm()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
' Variablen deklarieren
Dim Peergroup As String
Dim Fondszeile As Long
Dim cht As Chart
Dim rng As Range
Dim Dateiname As String
Dim X As Byte
' Rendite/Vola-Diagramme
Peergroup = ActiveSheet.Name
Fondszeile = ActiveCell.Row
For X = 0 To 9
Set cht = Worksheets("RendVola_01").ChartObjects(1).Chart
' Parameter für Reihe 1 - Peergroup
Set rng = Sheets(Peergroup).Range("FM7:FM10000").Offset(0, X)
cht.SeriesCollection(1).XValues = rng
Set rng = Sheets(Peergroup).Range("ES7:ES10000").Offset(0, X)
cht.SeriesCollection(1).Values = rng
' Parameter für Reihe 2 - Fonds
Set rng = Sheets(Peergroup).Range("FM" & Fondszeile).Offset(0, X)
cht.SeriesCollection(2).XValues = rng
Set rng = Sheets(Peergroup).Range("ES" & Fondszeile).Offset(0, X)
cht.SeriesCollection(2).Values = rng
'Diagramm als Grafik speichen, wird für Userform benötigt
Dateiname = ThisWorkbook.Path & Application.PathSeparator & "diagramm" & X & ".gif"
cht.Export Filename:=Dateiname, FilterName:="GIF"
Set cht = Nothing
Set rng = Nothing
Next X
Sheets(Peergroup).Activate
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub


Grüße
Norbert

Anzeige

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

Betreff
Datum
Anwender
Anzeige
AW: SeriesCollection.Value über VBA
19.12.2007 15:13:00
Alf
Hallo
Das Problem ist, dass man den Range rng nicht direkt den Eigenschaften
Series.XValues bzw. Series.Values zuweisen kann:

cht.SeriesCollection(1).XValues = rng


Stattdessen muss man den Verweis auf rng übergeben, der ein String ist und
die Form "='Tabelle1'!R7C4:R10000C4". Die Adresse entspricht übrigens dem Ausdruck,
der in der Excel-Adressleiste angezeigt wird, wenn man eine Datenreihe selektiert.
Die folgende Funktion liefert die Adresse von rng:


Private Function RangeToAddress(Ra As Range) As String
RangeToAddress = "='" & Ra.Parent.Name & "'!" & _
"R" & CStr(Ra.Row) & "C" & CStr(Ra.Column) & ":" & _
"R" & CStr(Ra.Rows.Count + Ra.Row - 1) & "C" & CStr(Ra.Column)
End Function


Und so einfach ist dann die Verwendung:


Sub Diagramm()
cht.SeriesCollection(1).XValues = RangeToAddress(rng)
End Sub


Ich hoffe, dass damit dein Problem gelöst ist!
Gruss, Alf

Anzeige
AW: SeriesCollection.Value über VBA
19.12.2007 16:45:04
Norbert
Hallo Alf,
danke für die Hilfe. Die Problematik mit dem direkten zuweisen der Range ist mir bekannt. Wird im Netz ja immer wieder angeführt. Jedoch verwundert mich, dass im ersten Duchlauf der Schhleife das Diagramm richtig angesprochen wird (xvalue und value werden richtig verändert) und erst im zweiten Durchlauf der Fehler kommt.
Trotz Deiner "Lösung" besteht das Problem jedoch weiter. Beim zweiten Durchlauf fehlt im Diagramm plötzlich eine Reihe, so dass keine Werte in die SeriesCollection(2) geschrieben werden können. Füge ich von Hand eine zweite Reihe in das Diagramm ein und lasse das Makro weiterlaufen, so wird das Diagramm korrekt erstelt. Das Makro bleibt aber dann wieder hängen, weil wieder die zweite Reihe fehlt.
Habe den Code um Deine "Lösung"erweitert, sieht dann so aus:

Private Function RangeToAddress(Ra As Range) As String
RangeToAddress = "='" & Ra.Parent.Name & "'!" & _
"R" & CStr(Ra.Row) & "C" & CStr(Ra.Column) & ":" & _
"R" & CStr(Ra.Rows.Count + Ra.Row - 1) & "C" & CStr(Ra.Column)
End Function


Sub Diagramm()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
' Variablen deklarieren
Dim Peergroup As String
Dim Fondszeile As Long
Dim cht As Chart
Dim rng As Range
Dim Dateiname As String
Dim X As Byte
'----------------------------
' Rendite/Vola-Diagramme
'----------------------------
Peergroup = ActiveSheet.Name
Fondszeile = ActiveCell.Row
For X = 0 To 9
Set cht = Worksheets("RendVola_01").ChartObjects(1).Chart
' Parameter für Reihe 1 - Peergroup
Set rng = Sheets(Peergroup).Range("FM7:FM10000").Offset(0, X)
cht.SeriesCollection(1).XValues = RangeToAddress(rng)
Set rng = Sheets(Peergroup).Range("ES7:ES10000").Offset(0, X)
cht.SeriesCollection(1).Values = RangeToAddress(rng)
' Parameter für Reihe 2 - Fonds
Set rng = Sheets(Peergroup).Range("FM" & Fondszeile).Offset(0, X)
cht.SeriesCollection(2).XValues = RangeToAddress(rng)
Set rng = Sheets(Peergroup).Range("ES" & Fondszeile).Offset(0, X)
cht.SeriesCollection(2).Values = RangeToAddress(rng)
'Diagramm als Grafik speichen, wird für Userform benötigt
Dateiname = ThisWorkbook.Path & Application.PathSeparator & "diagramm" & X & ".gif"
cht.Export Filename:=Dateiname, FilterName:="GIF"
Set cht = Nothing
Set rng = Nothing
Next X
Sheets(Peergroup).Activate
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub


Grüße
Norbert

Anzeige
AW: SeriesCollection.Value über VBA
19.12.2007 17:07:00
Alf
Hallo Norbert
Versuche mal für die zweite Datenreihe anstatt:
RangeToAddress(rng)
die Alternative:
rng.Value
Da es sich nur um eine einzelne Zelle handelt (also um sehr wenig Daten), sollte es klappen.
Gruss Alf

AW: SeriesCollection.Value über VBA
19.12.2007 16:30:50
fcs
Hallo Norbert,
das Problem tritt dann auf, wenn für die 2. Datenreihe (bzw. bei dir nur ein Datenpunkt) die Zelle mit dem X-Wert leer ist.
Dann verschwindet diese Datenreihe aus dem Diagramm und im nächsten Schleifendurchlauf gibt es keine 2 Datenreihe mehr, so dass die Bereichszuweisung kein Objekt mehr hat.
Du müsstest eine Prüfung einbauen und einen Dummie Zahlenwert zuweisen; etwa so:

If IsEmpty(rng) Then
'Dummy Wert als Datenwert in Reihe einfügen
cht.SeriesCollection(2).Values = 0
Else
cht.SeriesCollection(2).Values = rng
End If


Gruß
Franz

Anzeige
AW: SeriesCollection.Value über VBA
19.12.2007 21:21:00
Norbert
Danke fcs und Alf,
habe beide Anregungen verarbeitet und es "rockt".
Nach 30 fast schlaflosen Stunden werd ich mich jetzt erst mal aufs Ohr hauen.
Für die Nachwelt den "funzenden" Code im Anhang.
Grüße
Norbert
Public Fondsname As String
Public Peergroup As String
Public KAG As String
Public ISIN As String
Public Fondszeile As Integer

Private Function RangeToAddress(Ra As Range) As String
RangeToAddress = "='" & Ra.Parent.Name & "'!" & _
"R" & CStr(Ra.Row) & "C" & CStr(Ra.Column) & ":" & _
"R" & CStr(Ra.Rows.Count + Ra.Row - 1) & "C" & CStr(Ra.Column)
End Function


Sub Diagramm()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
'Öffentliche Variablen füllen
Peergroup = ActiveSheet.Name
Fondszeile = ActiveCell.Row
Fondsname = ActiveCell.Value
KAG = ActiveCell.Offset(0, 1).Value
ISIN = ActiveCell.Offset(0, 2).Value
' Variablen deklarieren
Dim cht As Chart
Dim rng As Range
Dim Dateiname As String
Dim X As Byte
'----------------------------
' Rendite/Vola-Diagramme
'----------------------------
Peergroup = ActiveSheet.Name
Fondszeile = ActiveCell.Row
For X = 0 To 9
Set cht = Worksheets("RendVola_01").ChartObjects(1).Chart
' Parameter für Reihe 1 - Peergroup
Set rng = Sheets(Peergroup).Range("FM7:FM10000").Offset(0, X)
cht.SeriesCollection(1).XValues = RangeToAddress(rng)
Set rng = Sheets(Peergroup).Range("ES7:ES10000").Offset(0, X)
cht.SeriesCollection(1).Values = RangeToAddress(rng)
' Parameter für Reihe 2 - Fonds
Set rng = Sheets(Peergroup).Range("FM" & Fondszeile).Offset(0, X)
'Dummy Wert als Datenwert in Reihe einfügen
If IsEmpty(rng) Then
cht.SeriesCollection(2).XValues = 0
Else
cht.SeriesCollection(2).XValues = rng.Value
End If
Set rng = Sheets(Peergroup).Range("ES" & Fondszeile).Offset(0, X)
'Dummy Wert als Datenwert in Reihe einfügen
If IsEmpty(rng) Then
cht.SeriesCollection(2).Values = 0
Else
cht.SeriesCollection(2).Values = rng.Value
End If
'Diagramm als Grafik speichen, wird für Userform benötigt
Dateiname = ThisWorkbook.Path & Application.PathSeparator & "diagramm" & X & ".gif"
cht.Export Filename:=Dateiname, FilterName:="GIF"
Set cht = Nothing
Set rng = Nothing
Next X
Sheets(Peergroup).Activate
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub


Anzeige
AW: SeriesCollection.Value über VBA
Norbert
Hallo Forum,
zu früh gefreut, aber wenigstens habe ich jetzt den Fehler ausgemacht. Wenn eine Range zum Beispiel ES7:ES10000 als erste Stelle (ES7) eine leere Zelle besitzt, kann die Values-Eigenschaft des Series-Objects nicht festgelegt werden. Die xValues-Eigenschaften werden trotz erster leerer Zelle der Range aber gesetzt.
Vorschläge?
Leere Zelle muss leer bleiben!
Gruß
Norbert

Anzeige
AW: SeriesCollection.Value über VBA
21.12.2007 15:27:44
Norbert
Hallo Forum,
Problem beseitigt.
Range-Quelle war eine ausgeblendete Spalte.
Diagramm - "nur sichtbare Zellen..." - Hacken entfernt - alles Prima.
Muss nicht imer ein VBA Problem sein.
Danke für die Hilfen.
Gruß Norbert
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige

Infobox / Tutorial

Excel VBA: SeriesCollection Values im Diagramm richtig nutzen


Schritt-für-Schritt-Anleitung

  1. VBA-Umgebung öffnen: Öffne Excel und drücke ALT + F11, um den Visual Basic for Applications (VBA) Editor zu starten.

  2. Neues Modul erstellen: Klicke auf Einfügen > Modul, um ein neues Modul zu erstellen.

  3. Code einfügen: Kopiere den folgenden Code in das Modul:

    Private Function RangeToAddress(Ra As Range) As String
       RangeToAddress = "='" & Ra.Parent.Name & "'!" & _
       "R" & CStr(Ra.Row) & "C" & CStr(Ra.Column) & ":" & _
       "R" & CStr(Ra.Rows.Count + Ra.Row - 1) & "C" & CStr(Ra.Column)
    End Function
    
    Sub Diagramm()
       Application.Calculation = xlCalculationManual
       Application.ScreenUpdating = False
       Dim Peergroup As String
       Dim Fondszeile As Long
       Dim cht As Chart
       Dim rng As Range
       Dim Dateiname As String
       Dim X As Byte
    
       Peergroup = ActiveSheet.Name
       Fondszeile = ActiveCell.Row
       For X = 0 To 9
           Set cht = Worksheets("RendVola_01").ChartObjects(1).Chart
           Set rng = Sheets(Peergroup).Range("FM7:FM10000").Offset(0, X)
           cht.SeriesCollection(1).XValues = RangeToAddress(rng)
           Set rng = Sheets(Peergroup).Range("ES7:ES10000").Offset(0, X)
           cht.SeriesCollection(1).Values = RangeToAddress(rng)
           Set rng = Sheets(Peergroup).Range("FM" & Fondszeile).Offset(0, X)
           cht.SeriesCollection(2).XValues = RangeToAddress(rng)
           Set rng = Sheets(Peergroup).Range("ES" & Fondszeile).Offset(0, X)
           cht.SeriesCollection(2).Values = RangeToAddress(rng)
           Dateiname = ThisWorkbook.Path & Application.PathSeparator & "diagramm" & X & ".gif"
           cht.Export Filename:=Dateiname, FilterName:="GIF"
           Set cht = Nothing
           Set rng = Nothing
       Next X
       Sheets(Peergroup).Activate
       Application.Calculation = xlCalculationAutomatic
       Application.ScreenUpdating = True
    End Sub
  4. Makro ausführen: Schließe den VBA-Editor und führe das Makro aus, indem Du ALT + F8 drückst und das Makro Diagramm auswählst.


Häufige Fehler und Lösungen

  • Fehlermeldung: "Methode SeriesCollection fehlgeschlagen"
    Diese Meldung tritt auf, wenn Du versuchst, auf eine nicht vorhandene SeriesCollection zuzugreifen. Stelle sicher, dass die Daten in der Range nicht leer sind. Wenn eine Zelle leer ist, kann die Values-Eigenschaft nicht gesetzt werden. Verwende diesen Code, um Dummy-Werte zuzuweisen:

    If IsEmpty(rng) Then
       cht.SeriesCollection(2).Values = 0
    Else
       cht.SeriesCollection(2).Values = rng
    End If
  • Diagramm zeigt keine zweite Reihe
    Überprüfe, ob die zweite Datenreihe tatsächlich existiert. Wenn eine Zelle der Range leer ist, wird die Reihe aus dem Diagramm entfernt. Füge eine Prüfung hinzu, um sicherzustellen, dass die x- und y-Werte vorhanden sind.


Alternative Methoden

  • Direkte Zuweisung verwenden: Wenn Du nur einen einzelnen Wert für xValues oder Values hast, kannst Du auch direkt den Wert angeben statt die Range zu verwenden:

    cht.SeriesCollection(2).Values = rng.Value
  • Verwendung von fullseriescollection: Du kannst auch die fullseriescollection verwenden, wenn Du alle Datenreihen eines Diagramms in einem Schritt bearbeiten möchtest:

    ActiveChart.FullSeriesCollection(1).Values

Praktische Beispiele

Hier ist ein einfaches Beispiel, um die SeriesCollection in einem Diagramm zu verwenden:

Sub BeispielDiagramm()
    Dim cht As Chart
    Set cht = Charts.Add
    cht.ChartType = xlXYScatter
    cht.SeriesCollection.NewSeries
    cht.SeriesCollection(1).XValues = "={1, 2, 3, 4, 5}"
    cht.SeriesCollection(1).Values = "={2, 3, 5, 7, 11}"
End Sub

Dieses Beispiel erstellt ein einfaches XY-Diagramm mit fiktiven Werten.


Tipps für Profis

  • Verwende activechart.fullseriescollection: Diese Methode ist besonders nützlich, wenn Du mit einer großen Anzahl von SeriesCollection arbeiten musst.
  • Debuggen mit Debug.Print: Nutze Debug.Print für die Ausgabe von Variablenwerten während der Ausführung, um schnell Fehler zu identifizieren.
  • Optimierung: Setze Application.Calculation und Application.ScreenUpdating zu Beginn und am Ende Deines Makros, um die Leistung zu verbessern.

FAQ: Häufige Fragen

1. Warum funktioniert cht.SeriesCollection(2).Values = rng manchmal nicht?
Wenn der rng-Bereich leer ist oder eine Zelle mit einem leeren Wert enthält, kann die Values-Eigenschaft nicht gesetzt werden. Stelle sicher, dass der Bereich gültige Werte enthält.

2. Gibt es eine Möglichkeit, die Reihenfolge der SeriesCollection zu ändern?
Ja, Du kannst die Reihenfolge der SeriesCollection ändern, indem Du die Move-Methode verwendest, z.B. cht.SeriesCollection(1).Move 2, um die erste Reihe an die zweite Position zu verschieben.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige