VBA嵌套循环实现列求和并赋值给二维数组变量求助
问题分析与修正方案
你的代码存在两个核心问题:
- 数组
V未完成初始化,直接使用V(i,j)会触发"下标越界"错误 - 直接将两个Range对象相加后赋值给
V(i,j)的写法不符合VBA数组赋值规则,需要先将Range转换为内存数组再操作
修正后的代码
Sub sommeV40() Dim i As Integer, j As Integer Dim V As Variant Dim arrI As Variant, arrJ As Variant ' 初始化二维数组V:第一维1~17,第二维2~18,每个元素用于存储列求和后的数组 ReDim V(1 To 17, 2 To 18) For i = 1 To 17 ' 先读取工作表i的C2:C66605到内存数组,减少工作表访问次数,提升效率 arrI = Sheets(i).Range("C2:C66605").Value For j = i + 1 To 18 ' 读取工作表j的目标列数组 arrJ = Sheets(j).Range("C2:C66605").Value ' 逐元素相加(也可直接用arrI + arrJ,VBA支持同维度数组直接运算) Dim row As Long For row = LBound(arrI, 1) To UBound(arrI, 1) arrI(row, 1) = arrI(row, 1) + arrJ(row, 1) Next row ' 将求和后的数组赋值给V(i,j) V(i, j) = arrI Next j Next i End Sub
关键说明
- 数组初始化:用
ReDim V(1 To 17, 2 To 18)明确数组维度,匹配你的循环范围,避免下标越界 - 内存数组优化:先把Range数据读入
arrI、arrJ内存数组,比直接操作Range快得多,尤其处理大量行数据时 - 数组赋值规则:VBA中Range.Value返回的是二维数组(即使是单列),所以
V(i,j)存储的是一个66604行×1列的二维数组,后续可通过V(i,j)(row, 1)访问指定行的求和结果 - 简化运算:如果不需要逐行处理逻辑,可直接用
V(i,j) = arrI + arrJ,VBA会自动对同维度数组的对应元素执行加法运算
内容的提问来源于stack exchange,提问作者mohamed ali maarouf
相关产品推荐
相关产品推荐

