Supportnet / Forum / Tabellenkalkulation
VBA: dynamische Diagrammquellen
Frage
Hallo!
(Vorab: bin ein absoluter Laie und beherrsche leider auch die Fachsprache nicht - versuche aber mal einfach mich verständlich zu machen!)
Ich möchte in verschiedenen Excel-Sheets, die sich bereits in Abhängigkeit von einer Laufvariable "D" dynamisch erzeugen, jeweils zwei Diagramme mit unterschiedlicher Datenquelle erzeugen. Das funktioniert auch soweit:
[code]'erstes Diagramm
Charts.Add
ActiveChart.ChartType = xlLine
'!!!!!!!!!!!!!!!!!!!
ActiveChart.SetSourceData Source:=Sheets("Auswertung D " & D).Range("B20:E30"), PlotBy:=xlColumns
ActiveChart.Location Where:=xlLocationAsObject, Name:="Auswertung D " & D
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "Inländische Unternehmen"
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Perioden"
.Axes(xlValue, xlPrimary).HasTitle = True
.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Produktivität"
End With
ActiveChart.Axes(xlValue).Select
With ActiveChart.Axes(xlValue)
.MinimumScale = Unternehmen(D, 1, 1, 3)
End With
ActiveSheet.Shapes("Diagramm 1").IncrementLeft -229.5
ActiveSheet.Shapes("Diagramm 1").IncrementTop -105#
ActiveWindow.Visible = False
'zweites Diagramm
Charts.Add
ActiveChart.ChartType = xlLine
'!!!!!!!!!!!!!!!!!!!
ActiveChart.SetSourceData Source:=Sheets("Auswertung D " & D).Range("G20:J30"), PlotBy:=xlColumns
ActiveChart.Location Where:=xlLocationAsObject, Name:="Auswertung D " & D
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "Ausländische Unternehmen"
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Perioden"
.Axes(xlValue, xlPrimary).HasTitle = True
.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Produktivität"
End With
ActiveChart.Axes(xlValue).Select
With ActiveChart.Axes(xlValue)
.MinimumScale = Unternehmen(D, 1, n, 10)
End With
ActiveSheet.Shapes("Diagramm 2").IncrementLeft 240#
ActiveSheet.Shapes("Diagramm 2").IncrementTop -104.25[/code]
Jetzt sollen aber die zugehörigen Datenquellbereiche ebenfalls dynamisch eingelesen werden, da sie in ihren Ausmaßen von drei Variablen (Perioden, n, m) abhängig sind. Es ist also eine Änderung des "Range" erforderlich! Folgende Lösungen als Ersatz für die jeweilige Code-Zeile unter den "!!!!!!" wären von der Logik her passend, ergeben allerdings Fehlermeldungen:
[code]ActiveChart.SetSourceData Source:=Sheets("Auswertung D " & D).Range(cells(20,2),cells(20+Perioden,1+n-m)), lotBy:=xlColumns
ActiveChart.SetSourceData Source:=Sheets("Auswertung D " & D).Range(cells(20,3+n-m),cells(20+Perioden,3+n)), lotBy:=xlColumns[/code]
(Das statische Beispiel oben war für die Werte ausgelegt: Perioden=10, n=8, m=4)
Leider verträgt sich meine Cells-Schreibweise irgendwie nicht mit dem, was Range fordert und es kommt zu einem Fehler :-)
Wer weiß Rat?
Antwort 1 von Beverly
Hi,
du schreibst in deinem neu festgelegten Code
lotBy:=xlColumns
Das muss heißen
PlotBy:=xlColumns
Einen anderen Fehler kann ich eigentlich nicht feststellen.
Bis später,
Karin
du schreibst in deinem neu festgelegten Code
lotBy:=xlColumns
Das muss heißen
PlotBy:=xlColumns
Einen anderen Fehler kann ich eigentlich nicht feststellen.
Bis später,
Karin
Antwort 2 von Seradest
Mein Vorschlag: Du benennst die Datenquallen als Bereiche, benutzt dazu die Excel-Funktion:
Bereich.Verschieben
Damit kannst du sehr wahrscheinlich deine Bereiche so variabel halte wie du möchstest. Dann hast du auch keine Probleme diese Bereiche per VBA zu behandeln. Ansonsten gehört vor jede "Cells"-Aweisung auch ein: "Sheets("Auswertung D " & D)"
Also:
ActiveChart.SetSourceData Source:=Sheets("Auswertung D " & D).Range(Sheets("Auswertung D " & D).cells(20,2),Sheets("Auswertung D " & D).cells(20+Perioden,1+n-m)), lotBy:=xlColumns
Oder aber einfacher:
With Sheets("Auswertung D " & D)
ActiveChart.SetSourceData Source:= .Range(.cells(20,2),.cells(20+Perioden,1+n-m)), lotBy:=xlColumns
End With
Man beachte dabei die Punkte vor .Cells und .Range
Ich denke das dürfte helfen.
Grüße
Carsten
Bereich.Verschieben
Damit kannst du sehr wahrscheinlich deine Bereiche so variabel halte wie du möchstest. Dann hast du auch keine Probleme diese Bereiche per VBA zu behandeln. Ansonsten gehört vor jede "Cells"-Aweisung auch ein: "Sheets("Auswertung D " & D)"
Also:
ActiveChart.SetSourceData Source:=Sheets("Auswertung D " & D).Range(Sheets("Auswertung D " & D).cells(20,2),Sheets("Auswertung D " & D).cells(20+Perioden,1+n-m)), lotBy:=xlColumns
Oder aber einfacher:
With Sheets("Auswertung D " & D)
ActiveChart.SetSourceData Source:= .Range(.cells(20,2),.cells(20+Perioden,1+n-m)), lotBy:=xlColumns
End With
Man beachte dabei die Punkte vor .Cells und .Range
Ich denke das dürfte helfen.
Grüße
Carsten
Antwort 3 von ComoMolo
Vielen Dank an Karin und Carsten...es funktioniert!!
Bin total erleichtert - hatte schon ewig daran rumgebastelt und dann sind es am Ende nur einige "Kleinigkeiten" (die man aber auch erstmal wissen/erkennen muss!).
Danke auch, dass ihr so schnell geantwortet habt!
LG
Bin total erleichtert - hatte schon ewig daran rumgebastelt und dann sind es am Ende nur einige "Kleinigkeiten" (die man aber auch erstmal wissen/erkennen muss!).
Danke auch, dass ihr so schnell geantwortet habt!
LG