2012-05-13 47 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爲有趣/可怕的方法! –