【问题标题】:Using Arrays values as X and Y values in a chart在图表中使用数组值作为 X 和 Y 值
【发布时间】:2018-08-24 14:54:44
【问题描述】:

我正在尝试创建一个绘制 X 和 Y 点的图表,但在每个系列的每个 X 点之间绘制一条线。有点像这样:

但是我的问题是我如何在 VBA 的 SeriesCollection 中定义我的 XvaluesValues。这是因为我的值实际上存储在数组中。我使用了数组,因为我的数据是:

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 轴上绘制 Age1Age2 中的值。对应的 Y 值在Per 列中。但我需要为每个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

【问题讨论】:

  • 如果您遇到运行时错误,那么它绝对会编译。如果你得到一个编译错误,那就不同了。具体错误是什么,是哪一行导致的?
  • 另请注意:您已将 xdataydata 声明为 Range 对象,但您从未将它们实例化为范围。实际的赋值语句xdata = ... 可能还有其他问题,但是您不能在Nothing 中输入值,这就是未实例化的范围对象的含义:)
  • 我将xdataydata 重新定义为变体。编译错误是语法错误。与cmets就行了
  • 语法错误,因为(age1(i),age2(i)) 不是 VBA 中任何内容的有效表示法。我认为这就是您的意思:xdata = Array(age1(i), age2(i)) 但如果不对其进行测试,我很确定这是行不通的,因为看起来您正在尝试将两个 age 数据的数组放入一个系列 @987654341 @。每个系列都必须有自己的 XValue。
  • 使用您的建议编辑的代码,仍然显示下标超出范围。但现在它可以编译了。

标签: excel vba charts


【解决方案1】:

问题在于如何调用数组的各个部分。 age1 数组以及其他数组是二维的。因此,您需要 age1(i,1) 而不是 age1(i),这样 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

【讨论】:

  • 干得好,是的range.Value 总是返回一个二维数组。
猜你喜欢
  • 2022-10-14
  • 1970-01-01
  • 2014-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多