Excel 将数组值用作图表中的X和Y值
我试图创建一个图表,绘制X点和Y点,但在每个系列的每个X点之间绘制一条线。有点像这样: 然而,我的问题是如何在VBA的Excel 将数组值用作图表中的X和Y值,excel,vba,charts,Excel,Vba,Charts,我试图创建一个图表,绘制X点和Y点,但在每个系列的每个X点之间绘制一条线。有点像这样: 然而,我的问题是如何在VBA的SeriesCollection中定义我的Xvalues和Values。这是因为我的值实际上存储在数组中。我使用数组是因为我有以下数据: ID Age1 Age2 Per 1 21 22 54.2% 2 19 23 68.6% 3 18 23 42.0% 4 30 33
SeriesCollection
中定义我的Xvalues
和Values
。这是因为我的值实际上存储在数组中。我使用数组是因为我有以下数据:
ID Age1 Age2 Per
1 21 22 54.2%
2 19 23 68.6%
3 18 23 42.0%
4 30 33 45.1%
5 17 19 33.0%
6 19 22 41.3%
7 22 27 20.4%
8 19 20 56.4%
9 30 33 42.8%
10 21 22 59.7%
因此,我需要在X轴上绘制Age1
和Age2
中的值。相应的Y值位于每列的中。但是我需要为每个ID创建一个新的序列。
我有以下代码,并在问题所在的位置进行了标记。注意,它不编译。我认为问题在于如何通过值来创建XY图表。我只想将这些值传递到图表上
Sub name()
Dim age1 As Variant
Dim age2 As Variant
Dim per1 As Variant
Dim per2 As Variant
Dim id As Variant
Dim ln As Integer
Dim cht As Chart
Dim wb As Workbook
Dim ws As Worksheet
Dim xdata As Varaint
Dim ydata As Varaint
Set wb = ThisWorkbook
Set ws = wb.Sheets(1)
id = ws.Range("A2", Range("A2").End(xlDown)).Value
age1 = ws.Range("B2", Range("B2").End(xlDown)).Value
age2 = ws.Range("C2", Range("C2").End(xlDown)).Value
per1 = ws.Range("D2", Range("D2").End(xlDown)).Value
per2 = ws.Range("D2", Range("D2").End(xlDown)).Value
ln = UBound(id) - LBound(id) + 1
Set cht = ws.ChartObjects("chart").Chart
With cht
.ChartArea.ClearContents
.ChartType = xlXYScatter
For i = 1 To ln
xdata=Array(age1(i),age2(i)) 'I assumed this would get the values in age1(i) and age2(i) and plot those as the xdata
ydata=Array(per1(i),per2(i)) 'Same error as above, but would use ydata
.SeriesCollection.NewSeries
.SeriesCollection(i).XValues = xdata
.SeriesCollection(i).Values = ydata
.SeriesCollection(i).Name = id(i)
Next i
End With
End Sub
问题是如何调用数组的各个部分。age1
数组和其他数组是二维的。因此,您希望age1(i)
而不是age1(i,1)
这样i
是行,1
是列
Dim xdata As Variant
Dim ydata As Variant
Set wb = ThisWorkbook
Set ws = wb.Sheets(1)
id = Range(Range("A2"), Range("A2").End(xlDown)).Value2
age1 = Range(Range("B2"), Range("B2").End(xlDown)).Value2
age2 = Range(Range("C2"), Range("C2").End(xlDown)).Value2
per1 = Range(Range("D2"), Range("D2").End(xlDown)).Value2
per2 = Range(Range("D2"), Range("D2").End(xlDown)).Value2
ln = UBound(id) - LBound(id) + 1
Set cht = ws.ChartObjects("chart").Chart
With cht
.ChartArea.ClearContents
.ChartType = xlXYScatterLines
For i = 1 To ln
xdata = Array(age1(i, 1), age2(i, 1))
ydata = Array(per1(i, 1), per2(i, 1))
.SeriesCollection.NewSeries
.SeriesCollection(i).XValues = xdata
.SeriesCollection(i).Values = ydata
.SeriesCollection(i).Name = id(i, 1)
Next i
End With
如果您遇到运行时错误,那么它绝对可以编译。如果您遇到编译错误,那就不同了。具体错误是什么?是哪一行导致的?另请注意:您已将xdata
和ydata
声明为范围对象,但从未将它们实例化为范围。实际赋值语句xdata=…
可能会有进一步的问题,但不能在Nothing
中输入值,这就是未实例化的范围对象:)我将xdata
和ydata
重新定义为变量。编译错误是语法错误。因为(age1(i),age2(i))
不是VBA中任何内容的有效符号,所以在带有注释的行上出现语法错误。我想这就是你的意思:xdata=Array(age1(I),age2(I))
但如果不进行测试,我很确定这是行不通的,因为看起来你试图将age
数据和XValues
数据的数组放在一个系列中。每个系列都必须有自己的XValues。使用您的建议编辑的代码仍然表示下标超出范围。但是现在它可以编译了。做得好,是的range.Value
总是返回一个二维数组。