Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1088to1092
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

Mit VBA Datenbezug einer Grafik ändern

Mit VBA Datenbezug einer Grafik ändern
Uli
Hi,
ich würde gerne eine Grafik mit n Linien in der Form ändern, dass der Tabellenbezug hinsichtlich der Spalten gleich bleibt, jedoch der Bereich der Zeilen sich ändert (z.B. Daten der Zeilen 200bis 300 statt 1 bis 100). Wie kann ich das ändern, ohne dabei die Spalten zu verändern. Wenn ich vorher die jeweilige Spalte der jeweiligen Linieabfragen kann, wäre das Problem wahrscheinlich gelöst.
Über einen ilfrechen Tip wäre ich sehr dankbar!
Beste Grüße
Uli
Diagramm-Datenquelleper VBA ändern
16.07.2009 14:38:27
NoNet
Hallo Uli,
probiere es mal mit einer Schleife über SeriesCollection - hier ein Beispiel für das erste Diagramm des aktuellen Blattes :
Sub DiagrammAendern()
Dim intS As Integer
With ActiveSheet.ChartObjects(1).Chart
'Ersetzt den Bereich "A2:A5" der Datenquelle durch "A6:A10" und "B2:B5" durch "B6:B10"
For intS = 1 To .SeriesCollection.Count
.SeriesCollection(intS).Formula = _
Replace(.SeriesCollection(1).Formula, "$A$2:$A$5", "$A$6:$A$10")
.SeriesCollection(intS).Formula = _
Replace(.SeriesCollection(1).Formula, "$B$2:$B$5", "$B$6:$B$10")
Next
End With
End Sub
Gruß, NoNet
Anzeige
AW: Diagramm-Datenquelleper VBA ändern
16.07.2009 14:48:48
Uli
Hi NoNEt,
erst mal VIELEN DANK für die schnelle Antwort!
In Deinem Beispiel weiß ich allerdings, dass die Werte sich in den Spalten A und B befinden. Wenn ich jedoch eine Schleife erstelle, die alle vorhandenen Linien durchläuft, weiß ich nicht, in welchen Spalten diese sich befinden. Genau genommen muss ich es auch nicht wissen, da ich egal auf welche Spalte sich die zu berücksichtigenden Reihen befinden, statt von Zeile 2 bis 5 nun von Zeile 6 bis 10 haben will. Wie Kann ich diese Zeilenangabe ändern, ohne die betroffene Spalte zu kennen oder sogar zu verändern?
Nochmals besten Dank für Deine Unterstützung
Uli
Anzeige
Ändere einfach "$2:" in "$6:"...
16.07.2009 15:05:46
NoNet
Hallo Uli,
probiere es mal so (im ersten Makro war ohnehin ein kleiner Fehler : es wurde nur die 1.Datenreihe geändert ;-) :
Sub DiagrammAendern2()
Dim intS As Integer
With ActiveSheet.ChartObjects(1).Chart
'Ersetzt den Bereich "A2:A5" der Datenquelle durch "A6:A10" und "B2:B5" durch "B6:B10"  _
etc.
For intS = 1 To .SeriesCollection.Count
.SeriesCollection(intS).Formula = _
Replace(.SeriesCollection(intS).Formula, "$5,", "$10,")
.SeriesCollection(intS).Formula = _
Replace(.SeriesCollection(intS).Formula, "$2:", "$6:")
Next
End With
End Sub
Gruß, NoNet
Anzeige
AW: Ändere einfach "$2:" in "$6:"...
16.07.2009 15:15:47
Uli
Hi NoNet,
;-)
auch auf die Gefahr, dass Du mich erschießt ... für den "Replace-Befehl"benötige ich die atuellen Werte (Reihe 5 und Reihe 10) um sie durch neue (Reihe 2 und Reihe 6) zu ersetzen.
Ich hatte folgenden Befehl im Sinn:
ActiveChart.SeriesCollection(i).Values = "=Daten!R" & Anfang & "C17:R" & Ende & "C17"
Hier kann ich vorher die Werte "Anfang" und "Ende" abfragen und dann in der Schleife verarbeiten. Allerdings beziehen sich danach alle Linien-Grafiken auf die Spalte 17 (C17). Die Spalte 17 eben deshalb, weil dieser Ausdruck fix in der Schleife steht. Wie kann ich diesen Aufruf auf die jeweils aufgerufene Linie beziehen.
Sorry, wegen meiner Hartnäckigkeit.
:-|
Beste Grüße
Uli
Anzeige
Ich würde doch nie jemanden erschießen...
16.07.2009 16:07:43
NoNet
Hallo Uli,
auch auf die Gefahr, dass Du mich erschießt ...

Ich würde doch NEIAMLS jemanden erschießen...
versuche es nun mal mit folgendem Makro (hier "zerschieße" ich allenfalls die Datenquelle der einzelnen Linien) :
VBA-Code:
Sub IchWuerdeDochNieJemandenErschiessen()
    Dim intA As Integer, intC As Integer, intS As Integer
    Dim sp1, sp2, strTemp As String, lngNZ1 As Long, lngNZ2 As Long
    lngNZ1 = 3 'Ab neue Zeile
    lngNZ2 = 9 'Bis neue Zeile
    With ActiveSheet.ChartObjects(1).Chart
        'Ersetzt den Bereich "A2:A5" der Datenquelle durch "A6:A10" und "B2:B5" durch "B6:B10"
        For intS = 1 To .SeriesCollection.Count
            strTemp = ""
            sp1 = Split(.SeriesCollection(intS).FormulaR1C1, "!") 'Datenquelle nach ! splitten
            For intA = LBound(sp1) + 2 To UBound(sp1)
                sp2 = Split(sp1(intA), ":") 'Teil der Datenquelle nach ":" splitten
                strTemp = ""
                intC = InStr(sp2(LBound(sp2)), "C")
                strTemp = strTemp & "R" & lngNZ1 & Mid(sp2(LBound(sp2)), intC)
                intC = InStr(sp2(UBound(sp2)), "C")
                strTemp = strTemp & ":R" & lngNZ2 & Mid(sp2(UBound(sp2)), intC)
                sp1(intA) = strTemp
            Next
            .SeriesCollection(intS).FormulaR1C1 = Join(sp1, "!")
        Next
    End With
End Sub
Gruß, NoNet
AW: Ich würde doch nie jemanden erschießen...
Uli

NOCH nicht erschießt ...
:-(
Sorry, da ich keine Grafik in einem Tabellenblatt habe sondern ein eigenes Diagrammblatt, komme ich nicht so ganz mit Deinem Quellcode klar.
Ich wollte wie folgt vorgehen:
Sub ZeilenAendern()
Anfang = Application.InputBox("Grafik von Zeile ...")
Ende = Application.InputBox("bis Zeile ...")
For i = 1 To ActiveChart.SeriesCollection.Count
ActiveChart.SeriesCollection(i).Values = "=Daten!R" & Anfang & "C1:R" & Ende & "C1"
Next
End Sub
ABER: Die Werte für "Anfang" und "ENDE" kann ich einlesen und dann ändern. Bei dem Schleifendurchlauf wird allerdings jedesmal wieder die Spalte A (=C1) gewählt, auch wenn vorher die Kurven siche auf die Spalten A, B, C, ... bezogen haben. Wie stelle ich es an, dass jeweils die aktuelle Spalte genommen wird und mit neuem Zeilenanfang und Zeilenende gesetzt wird.
Hmmm... ich würde mich übrigens sehr gerne in irgendeiner Weise bei Dir für Deine Mühe erkenntlich zeigen, da ich sehr froh über Deine Unterstützung bin!!!
Beste Grüße
Uli
Dann eine Kombination aus beiden...
NoNet

Hallo Uli,
die Problematik liegt ja darin, dass MS in VBA keine geeignete Eigenschaft zum Auslesen der Datenquelle bereitstellt, daher muss man ja so verworrene Wege wie über die "Zerlegung der SeriesCollection" gehen.
Das, was Du möchtest, ist durchaus verständlich, aber leider mangels der VBA-Möglichkeiten SO nicht zu lösen - da bist Du nicht der Erste, der darüber fluchen möge...
Die Zeilenangaben hatte ich in meinem Code fest hinterlegt, natürlich kann man diese aber auch per Application.InputBox vom Anwender eingeben lassen. Um den Code allgemeingültig - sowohl für ein Chart auf einem Tabellenblatt wie auch ein eigenes Chart-Blatt zu erstellen, kann man sich eines Objektes (hier im Code : objCh) bedienen.
Der Code sieht dann so aus :
Sub DiagrammDatenquelleAendernVariabel()
Dim intA As Integer, intC As Integer, intS As Integer
Dim sp1, sp2, strTemp As String, lngNZ1 As Long, lngNZ2 As Long
Dim objCh As Object
'lngNZ1 = 3 'Ab neue Zeile
'lngNZ2 = 9 'Bis neue Zeile
lngNZ1 = Application.InputBox("Grafik von Zeile ...")
lngNZ2 = Application.InputBox("bis Zeile ...")
If TypeName(ActiveSheet) = "Chart" Then
'Aktuelles Blatt ist bereits ein CHART-Blatt
Set objCh = ActiveChart
ElseIf TypeName(ActiveSheet) = "Worksheet" Then
'Aktuelles Blatt ist ein Tabellenblatt => 1.Chart auf Tabellenblatt
Set objCh = ActiveSheet.ChartObjects(1).Chart
End If
With objCh
'Ersetzt in der Datenquelle die aktuellen Zeilenangaben durch Zeilen 3 bis 9
For intS = 1 To .SeriesCollection.Count
strTemp = ""
sp1 = Split(.SeriesCollection(intS).FormulaR1C1, "!") 'Datenquelle nach ! splitten
'?ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1).FormulaR1C1
'Z.B. : =SERIES(Tabelle1!R1C2,Tabelle1!R2C1:R6C1,Tabelle1!R2C2:R6C2,1)
For intA = LBound(sp1) + 2 To UBound(sp1)
sp2 = Split(sp1(intA), ":") 'Teil der Datenquelle nach ":" splitten
strTemp = ""
intC = InStr(sp2(LBound(sp2)), "C")
strTemp = strTemp & "R" & lngNZ1 & Mid(sp2(LBound(sp2)), intC)
intC = InStr(sp2(UBound(sp2)), "C")
strTemp = strTemp & ":R" & lngNZ2 & Mid(sp2(UBound(sp2)), intC)
sp1(intA) = strTemp
Next
.SeriesCollection(intS).FormulaR1C1 = Join(sp1, "!")
Next
End With
End Sub
Zu Deinem "Wunsch" ich würde mich übrigens sehr gerne in irgendeiner Weise bei Dir für Deine Mühe erkenntlich zeigen,, könnte ich Dir folgende Möglichkeiten anbieten :
- Spendiere mir ein "virtuelles Bier" (nur FRISCH und KALT sollte es sein ;-)
- ODER : Spende einen kleinen Betrag an die Gemeinschaft der in Excel-Foren Helfenden, indem Du z.B. die EXCELTREFFEN unterstützt, siehe hier : http://www.exceltreffen.de oder auch hier https://www.herber.de/treffen/ (Spende bitte jeweils an die Organisatoren der Treffen mit Hinweis auf den Grund der Spende)
- Melde Dich selbst bei einem der Treffen an und spendiere ein "echtes" (frisches und kühles) Bier
Gruß, NoNet
AW: Dann eine Kombination aus beiden...
Uli

In welcher Ecke finden denn die Treffen statt (mit Dir)? Würde Dir gerne persönlich das eine oder andere Bier zukommen lassen! Das würde ich allem anderen vorziehen. Sollte das aber zu weit sein, werde ich bestimmt etwas spenden.
...
Deinen Quellcode habe ich kopiert und gestartet ... und ... er läuft fehlerfrei durch ... :-( nur leider ändert er die Grafik nicht. Wäre es möglich, Dir irgendwie die Datei zukommen zu lassen, mit der ich es versuche?
Ich wäre Dir wirklich SEHR dankbar, wenn Du den entscheidenden Schritt mit mir noch gehen könntest!
BESTEN DANK weiterhin
Einfach Mappe per "File-Upload" hochladen
NoNet

Hallo Uli,
es wundert mich, dass das Diagramm nicht (sichtbar) geändert wird - bei meinem Test-Durchlauf hat das funktioniert.
Lade die Mappe einfach per File-Upload hoch und poste in Deiner Antwort die komplette URL (wird Dir nach dem Hochladen angezeigt !).
Die diesjährigen Excel-Treffen finden übrigens hier statt :
Ürzig (an der Mosel in Rheinland-Pfalz) :

Größere Kartenansicht
Bzw. in Coesfeld (Münsterland) :

Größere Kartenansicht
Für weitere Infos : klicke einfach mal die o.g. Links an....Klaro bin ich bei beiden Treffen auch dabei ;-)
Gruß, NoNet
AW: Einfach Mappe per "File-Upload" hochladen
Uli

Ok, lade das File jetzt hoch.
DANKE !!!
https://www.herber.de/bbs/user/63201.zip
Noch ein (vorerst letzter) Versuch...
NoNet

Hallo Uli,
das Problem lag darin, dass in meinem Test-Diagramm alle Informationen der Datenquelle mit Zellen aus der Tabelle verknüpft waren (also : Keine "leere" Beschriftung der X-Achse und kein fester Wert als Beschriftung der Datenreihen, sondern z.B: "=TABELLE1!A2")
Ich habe das Makro nun mal an Dein Diagramm angepasst - ohne Gewähr, dass es für ALLE Diagrammtypen auf dieser Erde funktioniert ;-) :
Sub DiagrammDatenquelleAendernVariabel()
Dim intA As Integer, intC As Integer, intS As Integer
Dim sp1, sp2, strTemp As String, lngNZ1 As Long, lngNZ2 As Long
Dim objCh As Object
'lngNZ1 = 3 'Ab neue Zeile
'lngNZ2 = 9 'Bis neue Zeile
lngNZ1 = Application.InputBox("Von Zeile ...")
lngNZ2 = Application.InputBox("Bis Zeile ...")
If TypeName(ActiveSheet) = "Chart" Then
'Aktuelles Blatt ist bereits ein CHART-Blatt
Set objCh = ActiveChart
ElseIf TypeName(ActiveSheet) = "Worksheet" Then
'Aktuelles Blatt ist ein Tabellenblatt => 1.Chart auf Tabellenblatt
Set objCh = ActiveSheet.ChartObjects(1).Chart
End If
With objCh
'Ersetzt in der Datenquelle die aktuellen Zeilenangaben durch Zeilen 3 bis 9
For intS = 1 To .SeriesCollection.Count
strTemp = ""
sp1 = Split(.SeriesCollection(intS).FormulaR1C1, ",") 'Datenquelle nach Komma  _
splitten
'?ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1).FormulaR1C1
'Z.B. : =SERIES(Tabelle1!R1C2,Tabelle1!R2C1:R6C1,Tabelle1!R2C2:R6C2,1)
For intA = LBound(sp1) + 1 To UBound(sp1) - 1
If InStr(sp1(intA), ":") > 0 Then
sp2 = Split(sp1(intA), ":") 'Teil der Datenquelle nach ":" splitten
strTemp = ""
intr = InStr(sp2(LBound(sp2)), "!R")
intC = InStr(intr, sp2(LBound(sp2)), "C")
strTemp = strTemp & Left(sp2(LBound(sp2)), intr + 1) & lngNZ1 & Mid(sp2( _
LBound(sp2)), intC)
intr = InStr(sp2(UBound(sp2)), "R")
intC = InStr(intr, sp2(UBound(sp2)), "C")
strTemp = strTemp & ":" & Left(sp2(UBound(sp2)), intr) & lngNZ2 & Mid(sp2( _
UBound(sp2)), intC)
sp1(intA) = strTemp
End If
Next
.SeriesCollection(intS).FormulaR1C1 = Join(sp1, ",")
Next
.Axes(xlCategory).TickLabelSpacing = (lngNZ2 - lngNZ1) / 20 '20 teilstriche auf X-Achse
End With
End Sub
Darüberhinaus gibt es aber auch elegante Lösungen zur dynamischen Definition der Datenquellen eines Diagramms (ohne VBA) - in irgendeinem (oder mehreren ?) Forum habe ich auch Beispiele dazu gepostet.
Da ich jetzt aber auch FA mache, erspare ich mir die Suche danach - evtl. mache ich mich später nochmal daran.
Einstweilen : Ciao und Gruß, NoNet
AW: Noch ein (vorerst letzter) Versuch...
Uli

SPITZE!!!!!!!!!!!!!!!
ES KLAPPT!!!
Ich danke Dir VIELMALS und werde Dich in mein Abendgebet einschießen. Es hat gerade etwas gedauert, da ich dabei bin, zentnerweise Grafiken neu zu erstellen!
Ich muss erst mal weitermachen und anschießend werde ich mal überegen, wie ich mich bei Dir am besten erkenntlich zeige!!!
VIELEN DANK nochmals und noch einen schnen Aben!!!
Uli
;-)
Anzeige
AW: Ich würde doch nie jemanden erschießen...
16.07.2009 16:27:07
Uli
NOCH nicht erschießt ...
:-(
Sorry, da ich keine Grafik in einem Tabellenblatt habe sondern ein eigenes Diagrammblatt, komme ich nicht so ganz mit Deinem Quellcode klar.
Ich wollte wie folgt vorgehen:
Sub ZeilenAendern()
Anfang = Application.InputBox("Grafik von Zeile ...")
Ende = Application.InputBox("bis Zeile ...")
For i = 1 To ActiveChart.SeriesCollection.Count
ActiveChart.SeriesCollection(i).Values = "=Daten!R" & Anfang & "C1:R" & Ende & "C1"
Next
End Sub
ABER: Die Werte für "Anfang" und "ENDE" kann ich einlesen und dann ändern. Bei dem Schleifendurchlauf wird allerdings jedesmal wieder die Spalte A (=C1) gewählt, auch wenn vorher die Kurven siche auf die Spalten A, B, C, ... bezogen haben. Wie stelle ich es an, dass jeweils die aktuelle Spalte genommen wird und mit neuem Zeilenanfang und Zeilenende gesetzt wird.
Hmmm... ich würde mich übrigens sehr gerne in irgendeiner Weise bei Dir für Deine Mühe erkenntlich zeigen, da ich sehr froh über Deine Unterstützung bin!!!
Beste Grüße
Uli
Anzeige
Dann eine Kombination aus beiden...
16.07.2009 17:02:40
NoNet
Hallo Uli,
die Problematik liegt ja darin, dass MS in VBA keine geeignete Eigenschaft zum Auslesen der Datenquelle bereitstellt, daher muss man ja so verworrene Wege wie über die "Zerlegung der SeriesCollection" gehen.
Das, was Du möchtest, ist durchaus verständlich, aber leider mangels der VBA-Möglichkeiten SO nicht zu lösen - da bist Du nicht der Erste, der darüber fluchen möge...
Die Zeilenangaben hatte ich in meinem Code fest hinterlegt, natürlich kann man diese aber auch per Application.InputBox vom Anwender eingeben lassen. Um den Code allgemeingültig - sowohl für ein Chart auf einem Tabellenblatt wie auch ein eigenes Chart-Blatt zu erstellen, kann man sich eines Objektes (hier im Code : objCh) bedienen.
Der Code sieht dann so aus :
Sub DiagrammDatenquelleAendernVariabel()
Dim intA As Integer, intC As Integer, intS As Integer
Dim sp1, sp2, strTemp As String, lngNZ1 As Long, lngNZ2 As Long
Dim objCh As Object
'lngNZ1 = 3 'Ab neue Zeile
'lngNZ2 = 9 'Bis neue Zeile
lngNZ1 = Application.InputBox("Grafik von Zeile ...")
lngNZ2 = Application.InputBox("bis Zeile ...")
If TypeName(ActiveSheet) = "Chart" Then
'Aktuelles Blatt ist bereits ein CHART-Blatt
Set objCh = ActiveChart
ElseIf TypeName(ActiveSheet) = "Worksheet" Then
'Aktuelles Blatt ist ein Tabellenblatt => 1.Chart auf Tabellenblatt
Set objCh = ActiveSheet.ChartObjects(1).Chart
End If
With objCh
'Ersetzt in der Datenquelle die aktuellen Zeilenangaben durch Zeilen 3 bis 9
For intS = 1 To .SeriesCollection.Count
strTemp = ""
sp1 = Split(.SeriesCollection(intS).FormulaR1C1, "!") 'Datenquelle nach ! splitten
'?ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1).FormulaR1C1
'Z.B. : =SERIES(Tabelle1!R1C2,Tabelle1!R2C1:R6C1,Tabelle1!R2C2:R6C2,1)
For intA = LBound(sp1) + 2 To UBound(sp1)
sp2 = Split(sp1(intA), ":") 'Teil der Datenquelle nach ":" splitten
strTemp = ""
intC = InStr(sp2(LBound(sp2)), "C")
strTemp = strTemp & "R" & lngNZ1 & Mid(sp2(LBound(sp2)), intC)
intC = InStr(sp2(UBound(sp2)), "C")
strTemp = strTemp & ":R" & lngNZ2 & Mid(sp2(UBound(sp2)), intC)
sp1(intA) = strTemp
Next
.SeriesCollection(intS).FormulaR1C1 = Join(sp1, "!")
Next
End With
End Sub
Zu Deinem "Wunsch" ich würde mich übrigens sehr gerne in irgendeiner Weise bei Dir für Deine Mühe erkenntlich zeigen,, könnte ich Dir folgende Möglichkeiten anbieten :
- Spendiere mir ein "virtuelles Bier" (nur FRISCH und KALT sollte es sein ;-)
- ODER : Spende einen kleinen Betrag an die Gemeinschaft der in Excel-Foren Helfenden, indem Du z.B. die EXCELTREFFEN unterstützt, siehe hier : http://www.exceltreffen.de oder auch hier https://www.herber.de/treffen/ (Spende bitte jeweils an die Organisatoren der Treffen mit Hinweis auf den Grund der Spende)
- Melde Dich selbst bei einem der Treffen an und spendiere ein "echtes" (frisches und kühles) Bier
Gruß, NoNet
Anzeige
AW: Dann eine Kombination aus beiden...
16.07.2009 17:24:41
Uli
In welcher Ecke finden denn die Treffen statt (mit Dir)? Würde Dir gerne persönlich das eine oder andere Bier zukommen lassen! Das würde ich allem anderen vorziehen. Sollte das aber zu weit sein, werde ich bestimmt etwas spenden.
...
Deinen Quellcode habe ich kopiert und gestartet ... und ... er läuft fehlerfrei durch ... :-( nur leider ändert er die Grafik nicht. Wäre es möglich, Dir irgendwie die Datei zukommen zu lassen, mit der ich es versuche?
Ich wäre Dir wirklich SEHR dankbar, wenn Du den entscheidenden Schritt mit mir noch gehen könntest!
BESTEN DANK weiterhin
Einfach Mappe per "File-Upload" hochladen
16.07.2009 17:39:23
NoNet
Hallo Uli,
es wundert mich, dass das Diagramm nicht (sichtbar) geändert wird - bei meinem Test-Durchlauf hat das funktioniert.
Lade die Mappe einfach per File-Upload hoch und poste in Deiner Antwort die komplette URL (wird Dir nach dem Hochladen angezeigt !).
Die diesjährigen Excel-Treffen finden übrigens hier statt :
Ürzig (an der Mosel in Rheinland-Pfalz) :

Größere Kartenansicht
Bzw. in Coesfeld (Münsterland) :

Größere Kartenansicht
Für weitere Infos : klicke einfach mal die o.g. Links an....Klaro bin ich bei beiden Treffen auch dabei ;-)
Gruß, NoNet
Anzeige
Noch ein (vorerst letzter) Versuch...
16.07.2009 18:29:24
NoNet
Hallo Uli,
das Problem lag darin, dass in meinem Test-Diagramm alle Informationen der Datenquelle mit Zellen aus der Tabelle verknüpft waren (also : Keine "leere" Beschriftung der X-Achse und kein fester Wert als Beschriftung der Datenreihen, sondern z.B: "=TABELLE1!A2")
Ich habe das Makro nun mal an Dein Diagramm angepasst - ohne Gewähr, dass es für ALLE Diagrammtypen auf dieser Erde funktioniert ;-) :
Sub DiagrammDatenquelleAendernVariabel()
Dim intA As Integer, intC As Integer, intS As Integer
Dim sp1, sp2, strTemp As String, lngNZ1 As Long, lngNZ2 As Long
Dim objCh As Object
'lngNZ1 = 3 'Ab neue Zeile
'lngNZ2 = 9 'Bis neue Zeile
lngNZ1 = Application.InputBox("Von Zeile ...")
lngNZ2 = Application.InputBox("Bis Zeile ...")
If TypeName(ActiveSheet) = "Chart" Then
'Aktuelles Blatt ist bereits ein CHART-Blatt
Set objCh = ActiveChart
ElseIf TypeName(ActiveSheet) = "Worksheet" Then
'Aktuelles Blatt ist ein Tabellenblatt => 1.Chart auf Tabellenblatt
Set objCh = ActiveSheet.ChartObjects(1).Chart
End If
With objCh
'Ersetzt in der Datenquelle die aktuellen Zeilenangaben durch Zeilen 3 bis 9
For intS = 1 To .SeriesCollection.Count
strTemp = ""
sp1 = Split(.SeriesCollection(intS).FormulaR1C1, ",") 'Datenquelle nach Komma  _
splitten
'?ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1).FormulaR1C1
'Z.B. : =SERIES(Tabelle1!R1C2,Tabelle1!R2C1:R6C1,Tabelle1!R2C2:R6C2,1)
For intA = LBound(sp1) + 1 To UBound(sp1) - 1
If InStr(sp1(intA), ":") > 0 Then
sp2 = Split(sp1(intA), ":") 'Teil der Datenquelle nach ":" splitten
strTemp = ""
intr = InStr(sp2(LBound(sp2)), "!R")
intC = InStr(intr, sp2(LBound(sp2)), "C")
strTemp = strTemp & Left(sp2(LBound(sp2)), intr + 1) & lngNZ1 & Mid(sp2( _
LBound(sp2)), intC)
intr = InStr(sp2(UBound(sp2)), "R")
intC = InStr(intr, sp2(UBound(sp2)), "C")
strTemp = strTemp & ":" & Left(sp2(UBound(sp2)), intr) & lngNZ2 & Mid(sp2( _
UBound(sp2)), intC)
sp1(intA) = strTemp
End If
Next
.SeriesCollection(intS).FormulaR1C1 = Join(sp1, ",")
Next
.Axes(xlCategory).TickLabelSpacing = (lngNZ2 - lngNZ1) / 20 '20 teilstriche auf X-Achse
End With
End Sub
Darüberhinaus gibt es aber auch elegante Lösungen zur dynamischen Definition der Datenquellen eines Diagramms (ohne VBA) - in irgendeinem (oder mehreren ?) Forum habe ich auch Beispiele dazu gepostet.
Da ich jetzt aber auch FA mache, erspare ich mir die Suche danach - evtl. mache ich mich später nochmal daran.
Einstweilen : Ciao und Gruß, NoNet
Anzeige
AW: Noch ein (vorerst letzter) Versuch...
16.07.2009 19:12:49
Uli
SPITZE!!!!!!!!!!!!!!!
ES KLAPPT!!!
Ich danke Dir VIELMALS und werde Dich in mein Abendgebet einschießen. Es hat gerade etwas gedauert, da ich dabei bin, zentnerweise Grafiken neu zu erstellen!
Ich muss erst mal weitermachen und anschießend werde ich mal überegen, wie ich mich bei Dir am besten erkenntlich zeige!!!
VIELEN DANK nochmals und noch einen schnen Aben!!!
Uli
;-)

304 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige