2013-03-06 36 views
0

我有一个电子表格,看起来像这样:添加变量系列到图表W/VBA

A  1/1/2013  100 
A  2/1/2013  200 
A  3/1/2013  300 
B  1/1/2013  150 
B  2/1/2013  175 
B  3/1/2013  200 

三列是固定的,但每个系列条目数(第一列)变化。

使用VBA,我想自动将第一列中的每个唯一值作为散点图上的一系列值,第二列用于X值,第三列用于Y值。例如,对于上面的系列A,我需要动态确定范围B1:B3和C1:C3。

我生成了使用录制的宏将图表添加到图表的代码,所以我真正的障碍是找到每个系列的范围。我需要保留关联系列的名称(第一列),并且希望避免使用过滤器。

+0

我的教程[VBA来分割的数据范围划分成多个图表系列(http://peltiertech.com/vba-to-split- data-range-into-multiple-chart-series /)显示了如何使用VBA完成此操作,同时[将数据范围拆分为无VBA的多图表系列](http://peltiertech.com/split-data-range-into- multiple-chart-series-without-vba /)显示如何在没有VBA的情况下执行此操作。 – 2015-08-17 14:06:55

回答

0

我终于想到了一个有点迂回的解决方法;这里有兴趣的人的代码,适用于我原来的问题的布局:

Sub Example() 
    ' Variable Definitions 
    Dim y As Integer 
    Dim Name(73) As String 
    Dim Mins(73) As Integer 
    Dim Maxs(73) As Integer 

    ' Loop Through Name Column (Series) 
    For Each x In Range("A4:A" & Cells(Rows.Count, "A").End(xlUp).Row) 

     ' Add Values to Arrays, If Not Preexisting 
     If IsInArray(x.Value(), Name) = False Then 
      Name(y) = x.Value() 
      Mins(y) = x.Row() 
      Maxs(y) = x.Row() 
      y = y + 1 
     Else 
      Maxs(y - 1) = x.Row() 
     End If 

    Next x 

    ' Add to Chart 
    ActiveSheet.ChartObjects("Chart 1").Activate 
    ActiveChart.SeriesCollection.NewSeries 
    ActiveChart.FullSeriesCollection(1).Name = Name(0) 
    ActiveChart.FullSeriesCollection(1).XValues = "=Data!$B$" & Mins(0) & ":$B$" & Maxs(0) 
    ActiveChart.FullSeriesCollection(1).Values = "=Data!$C$" & Mins(0) & ":$C$" & Maxs(0) 
End Sub 

' Array Function from @JimmyPena 
' http://stackoverflow.com/a/11112305/2141501 
Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean 
    IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1) 
End Function 
+0

注意那个'Filter' - 如果你有一个系列名称是另一个名字的子字符串,那么如果较长的名字已经添加到你的数组中,你会得到一个错误的命中。 – 2013-03-07 17:22:10