VBA Chart.SetSourceData正在切换我的系列和类别

我沉浸了相当多的时间,似乎无法find解决办法。

我正在使用工作表select更改事件,该事件允许用户修改图表元素,而无需打开图表格式选项。 这个问题来自于我尝试使用的时候

.Chart.SetSourceData Union(rng0,rng5) 

进一步解释..我的图表有5个系列和4列的数据:
rng0包含了rng0的标题,
rng1包含series 1-5的第一列数据的数据,
rng2包含series 1-5的第二列数据的数据等。

我允许用户决定他们希望图表显示哪一系列数据(rng1-4) 。 用户通过一个工作表select框进行select,一旦select就变成一个检查。 然后我testing每个选项以确定在图表中包含哪一系列的数据。 在所有情况下,数据是不连续的,因为rng0是从rng1-4的几列。 我已经testing过这个事情是否重要,事实并非如此。 我使用联盟(rng5,rng1-4)来组合我所选的所有范围。

union(rng0,rng5)确实有效,但最终却交换了我的轴心。 我已经尝试了几件事情,包括:

 myChart.PlotBy = xlRows 'This does not change the chart at all 

我也搞乱了application.commandbars,但我找不到button去图表Tools -> Design -> Switch rows/columns.

下面是该地区的图片,下面是代码。 我感谢你的任何帮助/想法。 如果您需要更多信息,请告诉我。 谢谢

View post on imgur.com

这是代码的一个子集,因为它比较大,还包含一些与这个问题无关的其他内容。

  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 

在评论中回答

你提到你已经使用了PlotBy,你有没有在SetSourceData中使用它? 即Chart.SetSourceData Union(rng0, rng5), xlRows

答案由加里·埃文斯在评论中提供给OP。

 Chart.SetSourceData Union(rng0,rng5), xlRows 

似乎在做伎俩。