2012-05-13 50 views
15

是否有可能不是从范围创建图表(例如双Y轴折线图),而是从阵列数据创建?如果是这样,怎么样?从阵列数据创建图表,而不是范围

+0

[可以在运行时设置excel图表的动态数据,而不是Excel.Range](http://stackoverflow.com/questions/7380266/to-set-dynamic-data-of-excel-chart-at -runtime-and-not-excel-range) – assylias

+1

@assylias:这不是一个明显的重复...语言是C#,而不是VBA。这些概念几乎是一样的,但一个成功的例子看起来并不相同。 –

+0

@assylias另外我没有看到其他问题,因为实际上被回答 – brettdj

回答

13

是的。您可以将数组分配给图表上Series对象的XValuesValues属性。例如:

Dim c As Chart 
Dim s As Series 
Dim myData As Variant 

Set c = ActiveChart ' Assumes a chart is currently active in Excel... 
Set s = c.SeriesCollection(1) 

myData = Array(9, 6, 7, 1) ' or whatever 
s.Values = myData 
+0

这是您可以这样做的数据大小的限制。我不记得它是什么,但它很小。 – ja72

+4

@ ja72:定义“小”?...我只用16,000点测试它。 –

+0

太棒了。我立场纠正。 – ja72

8

您可以指定数组在Excel 2007年起,但在以前的版本中图表系列我相信这是每个​​系列的长度在255个字符的限制。我已经使用来解决此限制的方法被示出在下面的随机游走例如:

Sub ChartArray() 

Dim x(0 To 1000, 0 To 0) As Double 
Dim y(0 To 1000, 0 To 0) As Double 
x(0, 0) = 0 
y(0, 0) = 0 
For i = 1 To 1000 
    x(i, 0) = i 
    y(i, 0) = y(i - 1, 0) + WorksheetFunction.NormSInv(Rnd()) 
Next i 

Charts.Add 
ActiveChart.ChartType = xlXYScatterLinesNoMarkers 
With ActiveChart.SeriesCollection 
    If .Count = 0 Then .NewSeries 
    If Val(Application.Version) >= 12 Then 
     .Item(1).Values = y 
     .Item(1).XValues = x 
    Else 
     .Item(1).Select 
     Names.Add "_", x 
     ExecuteExcel4Macro "series.x(!_)" 
     Names.Add "_", y 
     ExecuteExcel4Macro "series.y(,!_)" 
     Names("_").Delete 
    End If 
End With 
ActiveChart.ChartArea.Select 

End Sub 

的另一种方法是将名称指定到阵列(类似于上面的解决方法),然后设置一系列指分配的名称。只要保存为xls格式,在所有版本中都可以正常工作,但在保存为新的xlsx/xlsm/xlsb格式时,似乎存在8192个字符的命名数组的长度限制。

+0

出于好奇,ExecuteExcel4Macro'技巧在2007年及之后不起作用吗?它在Excel 2007中试用了它,并且该图表不包含任何数据。 –

+0

没有旧的Excel 4命令似乎无法在更高版本的图表上工作,这很烦人。 –

+0

好的,谢谢。 +1为有趣/可怕的方法! –