You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VBA动态数组存储图表SeriesCollection值仅保留最后结果问题咨询

问题根源

你的数组只保留最后一组值的核心问题不是Redim语法错误,是两点逻辑错误:

  • 你每次执行XValuesA() = 系列.XValues时,都是用当前系列的一维数组直接覆盖整个XValuesA的全部内容,而非向数组追加写入新数据
  • 你每次调用ReDim Preserve XValuesA(1 To RangeOccupiedA + 2)时,数组长度都是固定值,没有跟随新增的系列数量动态调整,同时你用一维数组存储多组各含2个点的系列数据,结构本身就不合理。

修正方案

建议使用二维数组存储数据,由于VBA中ReDim Preserve仅支持修改数组的最后一维,我们可以把点位维度放在最前,系列序号维度放在最后,每次新增系列时扩展最后一维即可。

修正后的代码示例:

i = 1
SeriesAddedA = 1
RangeOccupiedA = Range("A2").End(xlDown).Row
RangeOccupiedB = Range("B2").End(xlDown).Row
MaxRangeOccupied = WorksheetFunction.Max(RangeOccupiedA, RangeOccupiedB)
' 定义二维数组,第一维存2个点位,第二维存系列序号,初始先声明为0个系列
Dim XValuesA() As Double, YValuesA() As Double
ReDim XValuesA(1 To 2, 1 To 0)
ReDim YValuesA(1 To 2, 1 To 0)

Do While i < MaxRangeOccupied
    FilledCompA = NextFilled(Cells(i, 1))
    PrevCell = PrevFilled(Cells(i + 1, 1))
    rowdiff = FilledCompA - PrevCell
    
    If (rowdiff < 2 And PrevCell <> 0 And FilledCompA <> 0) Or (PrevCell <> 0 And rowdiff > 0) Then
        chart.SeriesCollection.NewSeries
        With chart.FullSeriesCollection(SeriesAddedA)
            If rowdiff < 2 Then
                .Name = "Reaction Step A " & SeriesAddedA - 1
                .XValues = "=" & "'" & ActiveSheet.Name & "'" & "!$E$" & FilledCompA - 1 & ":$E$" & FilledCompA
                .Values = "=" & "'" & ActiveSheet.Name & "'" & "!$M$" & FilledCompA - 1 & ":$M$" & FilledCompA
            Else
                .Name = "Reaction Step prev A " & SeriesAddedA - 1
                .XValues = "=" & "(" & "'" & ActiveSheet.Name & "'" & "!$E$" & FilledCompA - rowdiff & "," & "'" & ActiveSheet.Name & "'" & "!$E$" & FilledCompA & ")"
                .Values = "=" & "(" & "'" & ActiveSheet.Name & "'" & "!$M$" & FilledCompA - rowdiff & "," & "'" & ActiveSheet.Name & "'" & "!$M$" & FilledCompA & ")"
            End If
            ' 先扩展数组第二维,新增一个系列的位置
            ReDim Preserve XValuesA(1 To 2, 1 To SeriesAddedA)
            ReDim Preserve YValuesA(1 To 2, 1 To SeriesAddedA)
            ' 逐个点位写入,不要直接覆盖整个数组
            Dim tempX As Variant, tempY As Variant
            tempX = .XValues
            tempY = .Values
            XValuesA(1, SeriesAddedA) = tempX(1)
            XValuesA(2, SeriesAddedA) = tempX(2)
            YValuesA(1, SeriesAddedA) = tempY(1)
            YValuesA(2, SeriesAddedA) = tempY(2)
        End With
        SeriesAddedA = chart.SeriesCollection.Count + 1
    End If
Loop

' 后续读取示例:读取第3个系列的第2个X值
Debug.Print XValuesA(2, 3)

补充说明

如果需要按XValuesA(系列序号, 点位序号)的习惯读取数据,可以使用嵌套数组(一维数组的每个元素存储对应系列的一维点位数组),实现逻辑类似,只需要修改数组定义和赋值方式即可。

内容的提问来源于stack exchange,提问作者MrYuchiang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 23:36:04