Ich habe ziemlich viel Zeit in dies versunken und kann nicht scheinen, eine Lösung zu finden.VBA Chart.SetSourceData schaltet meine Serie und Kategorien
Ich verwende ein Ereignis zum Ändern der Arbeitsblattauswahl, mit dem eine Person die Diagrammelemente ändern kann, ohne die Diagrammformatierungsoptionen öffnen zu müssen. Das Problem kommt aus, wenn ich versuche
.Chart.SetSourceData Union(rng0,rng5)
zu nutzen, um ein wenig zu erklären .. mein Diagramm hat 5-Serie und 4 Spalten von Daten:
rng0
enthalten den Titel für series1-5
,
rng1
enthält die Daten, für die erste Spalte von Daten für series 1-5
,
rng2
enthält die Daten für die zweite Spalte von Daten für series 1-5
, etc ..
I allowin bin g Der Benutzer entscheidet, welche Datenreihe (rng1-4)
er möchte, dass das Diagramm angezeigt wird. Der Benutzer trifft seine Auswahl über ein Auswahlfeld für Arbeitsblätter, das nach der Auswahl zu einem Scheck wird. Ich teste dann jede Option, um zu bestimmen, welche Datenserie in das Diagramm aufgenommen werden soll. In allen Fällen sind die Daten nicht zusammenhängend, da rng0 einige Spalten von rng1-4
entfernt ist. Ich habe getestet, ob das zählt oder nicht und es nicht. Ich verwende eine Union (rng5,rng1-4)
, um alle meine ausgewählten Bereiche zu kombinieren.
Die union(rng0,rng5)
funktioniert, aber am Ende meine Achse vertauschen. Ich habe mehrere Dinge ausprobiert, einschließlich:
myChart.PlotBy = xlRows 'This does not change the chart at all
Ich habe auch mit dem Application.CommandBars durcheinander, aber ich konnte die Schaltfläche, um nicht gefunden Chart Tools -> Design -> Switch rows/columns.
Im Folgenden ein Bild von der Umgebung ist und Darunter ist der Code. Ich schätze Ihre Hilfe/Ideen. Wenn Sie weitere Informationen benötigen, lassen Sie es mich wissen. Dank
Dies ist Teilmenge des Codes, da es viel größer ist und enthält einige andere Dinge nicht relevant für dieses Problem.
Dim myChart As ChartObject
Dim rng0 As Range
Dim rng1 As Range
Dim rng2 As Range
Dim rng3 As Range
Dim rng4 As Range
Dim rng5 As Range
'Slide area selected, set new subranges
Set singleChart1 = Range("OTPSingleChart1Sel")
'Test which chart is being modified
'Single Chart1
If Not Intersect(Target, singleChart1) Is Nothing Then
Set myChart = otpWS.ChartObjects("OTPSingleChart1")
With otpWS
Set rng0 = Range("OTPSingleChart1Sel").Offset(0, 5)
Set rng1 = Range("OTPSingleChart1Sel").Offset(0, 7)
Set rng2 = Range("OTPSingleChart1Sel").Offset(0, 8)
Set rng3 = Range("OTPSingleChart1Sel").Offset(0, 9)
Set rng4 = Range("OTPSingleChart1Sel").Offset(0, 10)
End With
'Test offset
'D2P
If Target.Offset(0, 2).Value = "D2P" Then
If Target.Value = "a" Then
'Test if at least one of our segments is on
With otpWS
If Application.WorksheetFunction.CountIf(.Range("OTPSingleChart1Sel").Range(.Cells(1, 1), .Cells(4, 1)), "a") > 1 Then
Else
MsgBox ("At least one segment must be visible")
Exit Sub
End If
End With
Target.Value = ""
With otpWS
i = 1
For Each chk In .Range("OTPSingleChart1Sel").Range(.Cells(1, 1), .Cells(4, 1))
If chk.Value = "a" Then
If rng5 Is Nothing Then
If i = 1 Then
Set rng5 = rng1
ElseIf i = 2 Then
Set rng5 = rng2
ElseIf i = 3 Then
Set rng5 = rng3
ElseIf i = 4 Then
Set rng5 = rng4
End If
Else
If i = 1 Then
Set rng5 = Union(rng5, rng1)
ElseIf i = 2 Then
Set rng5 = Union(rng5, rng2)
ElseIf i = 3 Then
Set rng5 = Union(rng5, rng3)
ElseIf i = 4 Then
Set rng5 = Union(rng5, rng4)
End If
End If
End If
i = i + 1
Next chk
End With
With myChart
.Chart.SetSourceData Union(rng0, rng5)
End With
Sie haben erwähnt, dass Sie 'PlotBy' verwendet haben, haben Sie es in SetSourceData verwendet? d. h. 'Chart.SetSourceData Union (rng0, rng5), xlRows' –
Wow, ich wusste nicht .SetSourceData hatte das als Parameter .. Das funktioniert jetzt wunderbar .. Danke! – Citanaf