14.5k Aufrufe
Gefragt in Tabellenkalkulation von
Hallo,
1)ich hab in Excel 2007 ein Set von Diagramme erstellt. Die Variable sprich Spalte der X Achse ist immer identisch, die Variable für die y Achse ist immer unterschiedlich ( ca. 40 Diagramme)
2) Ich hab das set an Diagrammen kopiert und nun will ich nur die X achse variable (Spalte) ändern und entsprechden die Beschriftung der Achse angeben, . Damit ich nicht alles zu fuß ändern muss hab ich mir gedacht diese Änderung mit dem makrorecoder aufzuzeichnen und für die restlichen Diagramme das makro zu zuweisen. Funktioniert jedoch ned.
Das is der VBA Code:

ActiveSheet.ChartObjects("Diagramm 97").Activate
ActiveChart.SeriesCollection(1).Select
ActiveChart.SeriesCollection(1).Formula = _
"=DATENREIHE(""Height DBH"";Tabelle1!$BS$370:$BS$671;Tabelle1! $BJ$370:$BJ$671;1)"

Die einzige Änderung die ich vorgenommen habe und aufgezeichnet habe war die änderung von $DC$370:$DC§671 auf $BS$370:$BS$671(wie es im makro steht)
Es wäre nun klasse, wenn ich die änderung bei allen restlichen Diagramme per knopfdruck (makro) durchführen könnte und die Achsenbeschriftung (ist im Makrocode nicht enthalten). Wäre genial wenn mir wer weiter helfen könnte.
Schöne Grüße

25 Antworten

0 Punkte
Beantwortet von beverly Experte (3.5k Punkte)
Hi,

vom Prinzip her reicht diese Zeile, in der du nur jeweils den Diagrammnamen und den Datenbereich für jedes Diagramm anpassen musst:

ActiveSheet.ChartObjects("Diagramm 1").Chart.SeriesCollection(1).XValues = Range("BS370:BS671")


Bis später,
Karin
0 Punkte
Beantwortet von
Hallo Karin,
super funktioniert soweit. Gibt es eine Möglichkeit, dass man den Diagrammnamen nicht jedesmal anpassen muss bei der Zuweisung auf ein Diagramm?
Vielen Dank schon mal
Schöne Grüße
Andi
0 Punkte
Beantwortet von beverly Experte (3.5k Punkte)
Hi Andi,

markiere das jeweilige Diagramm und mit dem folgenden Code wird eine InputBox aufgerufen, in die du den Bereich für die Daten eingeben kannst:
Sub DiaBearbeiten()
Dim raBereich As Range
If TypeOf Selection Is ChartArea Then
On Error Resume Next
Set raBereich = Range(Application.InputBox("Bitte den Bereich eintragen"))
On Error GoTo 0
If Not raBereich Is Nothing Then
ActiveSheet.ChartObjects(Application.Substitute(Selection.Parent.Name, _
ActiveSheet.Name & " ", "")).Chart.SeriesCollection(1).XValues = raBereich
Else
MsgBox "Bitte einen gültigen Bereich eintragen"
End If
Else
MsgBox "Bitte ein Diagramm markieren"
End If
Set raBereich = Nothing
End Sub

Bis später,
Karin
0 Punkte
Beantwortet von
Hi Karin,

super vielen Dank deine Makros haben mir sehr weitergeholfen. Ich verwende zwar nicht die inputbox, habe deinen Code abgeändert indem ich den x werte bereich in den VBA Code aufgenommen habe:
Sub Dia()
Dim raBereich As Range
If TypeOf Selection Is ChartArea Then
On Error Resume Next
Set raBereich = Range("DU370:DU671")
On Error GoTo 0
If Not raBereich Is Nothing Then
ActiveSheet.ChartObjects(Application.Substitute(Selection.Parent.Name, _
ActiveSheet.Name & " ", "")).Chart.SeriesCollection(1).XValues = raBereich
Else
MsgBox "Bitte einen gültigen Bereich eintragen"
End If
Else
MsgBox "Bitte ein Diagramm markieren"
End If
Set raBereich = Nothing
End Sub

Kann jetzt bei jedem Diagramm den X-Werte Bereich automatisch anpassen. Ist genau das was ich wollte und eine erhebliche Zeitersparnis.
Vielen Vielen Dank. Schöne Grüße.
Andi
0 Punkte
Beantwortet von beverly Experte (3.5k Punkte)
Hi Andy,

ich hatte das so verstanden, dass der Bereich für jedes Diagramm ein anderer ist - deshalb die Möglichkeit ihn per InputBox einzugeben. Wenn der Bereich fest im Code vorgegeben ist, kann man den Code wesentlich einfacher schreiben:
Sub Dia()
If TypeOf Selection Is ChartArea Then
ActiveSheet.ChartObjects(Application.Substitute(Selection.Parent.Name, _
ActiveSheet.Name & " ", "")).Chart.SeriesCollection(1).XValues = Range("DU370:DU671")
Else
MsgBox "Bitte ein Diagramm markieren"
End If
End Sub

Wenn du bei Codeausführung sicher bist, dass ein Diagramm markiert ist, kannst du auch noch den Else-Zweig weglassen und es reicht dieser Code:
Sub Dia()
ActiveSheet.ChartObjects(Application.Substitute(Selection.Parent.Name, _
ActiveSheet.Name & " ", "")).Chart.SeriesCollection(1).XValues = Range("DU370:DU671")
End Sub


Bis später,
Karin
0 Punkte
Beantwortet von
Hi Karin,
ja super so ist es einfacher und funktioniert auch. Hab jetzt noch eine weitere Frage wie muss ich den code ändern, wenn in dem Diagramm mehrer Datenreihen enthalten sind und ich sie entsprechend automatisch anpassen will? Hab schon selbst versucht "SeriesCollection(2)" in den Code miteinzubauen, leider sind meine VBA Kenntnisse gleich Null und es funktioniert nicht.
Schöne Grüße
Andi
0 Punkte
Beantwortet von beverly Experte (3.5k Punkte)
Hi Andy,

die X-Werte eines Rubrikendiagramms (Säulen, Balken, Linie, Fläche) müssen nur einmalig zugewiesen werden - es reicht also, wenn man das für 1 Datenreihe ausführst. Bei einem Punkt(XY)-Diagramm ist das für jede Datenreihe erforderlich:
Sub Dia()
Dim inReihe As Integer
With ActiveSheet.ChartObjects(Application.Substitute(Selection.Parent.Name, _
ActiveSheet.Name & " ", "")).Chart
For inReihe = 1 To .SeriesCollection.Count
.SeriesCollection(inReihe).XValues = Range("DU370:DU671")
Next inReihe
End With
End Sub

Bis später,
Karin
0 Punkte
Beantwortet von
Hi Karin,
wow vielen Dank für die schnelle Antwort. Ich mache XY Diagramme. Mit dem obigen Code bekommen alle Datenreihen den selben X-Werte Bereich Range("DU370:DU671") zugewiesen in meinen Diagrammen ist der X Wertebereich jedoch unterschiedlich für die verschiedenen Datenreihen.
Mir schwebt vor den x Wertebereich der einzelnen Datenreihen im Vba code anzugeben:
Reihe1: XValues = Range("DU370:DU671")
Reihe2: XValues = Range("DU672:DU800")
Reihe3: XValues = Range("DU801:DU1000")
Reihe4: XValues = Range("DU1001:DU1200")
Reihe5: XValues = Range("DU1201:DU1300")

so in etwa habe meist 5 Datenreihen. Das makro könnte ich dann auf den Rest meiner Diagramme anwenden und der X-Wertebereich würde sich bei den 5 Datenreihen entsprechend ändern. Kann man das hinbekommen?
Schöne Grüße
Andi
0 Punkte
Beantwortet von beverly Experte (3.5k Punkte)
Hi Andi,

vom Prinzip her so:
Sub Dia()
With ActiveSheet.ChartObjects(Application.Substitute(Selection.Parent.Name, _
ActiveSheet.Name & " ", "")).Chart
.SeriesCollection(1).XValues = Range("DU370:DU671")
.SeriesCollection(2).XValues = Range("DU672:DU800")
.SeriesCollection(3).XValues = Range("DU801:DU1000")
.SeriesCollection(4).XValues = Range("DU1001:DU1200")
.SeriesCollection(5).XValues = Range("DU1201:DU1300")
End With
End Sub

Eins verstehe ich nicht: dies ist doch ein fortlaufender Wertebereich - weshalb dann für jede Datenreihe einen eigenen Wertebereich? Ich kenne nun deine Arbeitsmappe nicht, aber ich würde meine Wertetabelle so aufbauen, dass für alle Datenreihen der gesamte Bereich von DU370:DU1300 als X-Wertebereich gilt. Wenn du jetzt die Y-Werte jeder Datenreihe in eine eigene Spalte schreibst (wobei Zellen für die keine Werte vorliegen leer bleiben und du sozusagen eine "gestaffelte" Wertetabelle hast) und diese gesamte Spalte (also von Zeile 370 bis Zeile 1300) als Y-Wertebereich im Diagramm angibst, werden nur diese Bereiche auch als Datenreihe dargestellt.

Bis später,
Karin
0 Punkte
Beantwortet von
Hi Karin,
super funktioniert vielen Dank.
Dein Vorschlag eine gestaffelte Tabelle anzulegen ist sehr gut, jedoch hab ich sehr viele unterschiedliche Variablen (Baumhöhe, Durchmesser, Kronenbreite..) an die 50 Stück. Bei mir gehts um Bäume, die ich vermessen habe und z.B. Qualität des Baumes (5 kategorien), Schaden des Baumes (4 Kategorien) usw. aufgenommen habe. Ich habe die Tabelle beispielsweise nach Qualität sortiert und will nun in einem xy Diagramm die Höhe und den Durchmesser des Stammes gegeneinader auftragen, getrennt nach den Qualitätsstufen(entspricht den 5 Datenreihen). Würde ich nun eine gestaffelte Tabelle anlegen müsste ich pro Variable z.B. nach Qualität sortiert 5 Spalten anlegen, bei 50 Variablen käme ich auf 250 Spalten und das wird mir dann zu unübersichtlich. Mit den Makro, das du mir jetzt geschrieben hast kann ich ein set an x/y Diagrammen, in dem z.B. der Baumdurchmesser immer den x Wertebereich bildet:

Durchmesser (x Wert) x Höhe (y-Wert)
Durchmesser x Kronenbreite
Durchmesser x Variable 3
Durchmesser x Variable 4.......... (50 Diagramme)

sehr schnell ändern, indem man z.B. die Baumhöhe als X-Wert angibt und den Zusammenhang mit den übrigen Variablen darstellen:

Höhe x Höhe
Höhe x Kronenbreite
Höhe x Variable 3
Höhe x Variable 4......
Wenn ich mit deinem Makro arbeite lässt sich das dann sehr schnell umsetzen, anstatt den Wertebereich für jedes Diagramm händisch einzugeben. Vielen Dank nochmal !!!!!
Gibt es eine Möglichkeit mehrere Digramme bzw. das gesamte Diagrammeset (Durchmesser x Variable 2,3.....50) zu markieren und den x Wertebereich für alle Diagramme mit einer Makrozuweisung zu ändern?

Schöne Grüße
Andi
...