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
相关产品推荐
相关产品推荐

