Anzeige
Archiv - Navigation
932to936
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
932to936
932to936
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

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

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

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
Anzeige

55 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige