【问题标题】:Passing a Four-Dimensional Array to a Chart SeriesCollection using VBA使用 VBA 将四维数组传递给 Chart SeriesCollection
【发布时间】:2015-01-29 13:23:34
【问题描述】:

我想知道如何使用 VBA 将四维数组的一维传递给 XY 散点图。

[我知道我可以通过费力地为所有内容输入单独的数组来做到这一点,但我希望让我的代码更紧凑。紧凑性对于填充数组特别有用,因为我已经完成了,所以我没有在下面包含它。我也知道如果我使用二维数组,那么我可以使用Application.Index,但我的理解是这不适用于三维数组或四维数组 - 如果我错了,请让我知道。我在几个网站上查看了许多查询,我只能使用Application.Index 找到有关 2D 数组的答案 - 如果有我错过的页面,请告诉我。]

我有一个已填充的数组变量:

Dim arrData() As Single
arrData(1 To 2, 1 To 4, 1 To 3, 1 To 56)

arrData 包含变量 1 到 56 的 Single 类型数据,在 2x4x3 布局内,因此有 1,344 个数据点。

我有一张图表:

Dim bIOpt As Byte
Dim bPOpt As Byte

For bIOpt = 1 To 4
For bPOpt = 1 To 4

Worksheets("Data").Activate
Range(Cells(1, 1), Cells(2, 2)).Select
Charts.Add
With ActiveChart
   .Type = xlXYScatter
   .ChartTitle.Delete
   With .SeriesCollection(1)
      .XValues = ?
      .Values = ?
   End With
   .SeriesCollection.NewSeries
   With .SeriesCollection(2)
      .XValues = ?
      .Values = ?
   End With
   .SeriesCollection.NewSeries
   With .SeriesCollection(3)
      .XValues = ?
      .Values = ?
   End With
End With

Next bPOpt
Next bIOpt

我希望每个SeriesCollection 包含来自arrData 的56 个点:XValues 将来自bPOpt 版本的arrData(2, bPOpt, n, ); (Y) Values 将来自arrData(1, bIOpt, n, )bIOpt 版本。

我不知道如何写“.XValues = ?”和“.Values = ?”行以达到我的目的。

感谢您的帮助。

克里斯

【问题讨论】:

    标签: arrays vba excel multidimensional-array


    【解决方案1】:

    您可以使用任何您想为 XValues 和 YValues 生成一维数组的循环算法,然后将这些数组传递给图表系列:

    Dim XVals(1 to 56) As Double, YVals(1 to 56) As Double
    
    ' loop to populate XVals, YVals from arrData
    ' blah blah
    ' end of loop
    
    With .SeriesCollection(1)
        .Values = YVals
        .XValues = XVals
    End With
    

    请注意,在 VBA 中使用 Singles 代替 Doubles 或 Ints 代替 Longs 没有任何优势。

    另请注意,Excel 的图表在处理来自工作表单元格的数据时比处理数组更可靠。如果遇到问题,可以先将 XVals 和 YVals 转储到几列中,然后将此数据范围用作图表系列数据。

    【讨论】:

    • 感谢 Jon - 我最终重写它以使用少于四个维度(我使用了一系列 2D 数组,而不是您建议的 1D 数组)。它使我的代码更高更复杂,仅此而已。所以我想知道是否甚至可以将 4D 数组传递给图表。我以为 Single 是 32 位的,而 Double 是 64 位的?另外,我发现将数据转储到图表比使用数组要慢,所以我不想这样做。
    • 您也不能将 4D 数组传递到工作表中,所以我不知道为什么可以将其传递到图表中。图表具有简单的数据要求。
    • 我认为单打是 16 位,双打是 32 位。重要的是 VBA 在 Double 中进行计算,因此传递给 calc 的任何 Singles 都将转换为 Double,如有必要,结果将转换回 Single。在计算之后,在第二次转换中发生任何溢出。使用 Singles 不会买任何东西,因为它会花费您两次转换和可能的溢出错误。相同的逻辑适用于整数和长整数。
    • 您可以轻松地将 4D 数组中的维度放入工作表中:对于 lRow 1 到 56 个 Cells(lRow,1) = arrData(1, 1, 1, lRow)。这在尝试定义 XValues 时不起作用。很高兴了解 Singles 和 Doubles,但我知道使用 Integers 和 Longs 而不是 Singles 和 Doubles 的愚蠢转换。
    • 一次填充一个单元格可能需要一段时间。将值转储到二维数组中,然后执行 Range("A1").Resize(nRows, nCols).Value = arrData2D
    猜你喜欢
    • 1970-01-01
    • 2016-07-07
    • 2021-07-15
    • 2012-03-25
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多