2016-06-09 12 views
3

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

http://imgur.com/sGajsQz

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 
+1

Sie haben erwähnt, dass Sie 'PlotBy' verwendet haben, haben Sie es in SetSourceData verwendet? d. h. 'Chart.SetSourceData Union (rng0, rng5), xlRows' –

+0

Wow, ich wusste nicht .SetSourceData hatte das als Parameter .. Das funktioniert jetzt wunderbar .. Danke! – Citanaf

Antwort

1

Antwort in Kommentar

Sie erwähnten Sie PlotBy verwendet haben, haben Sie verwendet es innerhalb SetSourceData? d. h. Chart.SetSourceData Union(rng0, rng5), xlRows

1

Antwort von Gary Evans in den Kommentaren zum OP geliefert.

Chart.SetSourceData Union(rng0,rng5), xlRows 

schien den Trick zu tun.