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
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
;-)
|