VBA中如何用数组替代SUMIF函数里的单元格区域?
调整后的VBA数组版SUMIF实现
核心思路
原代码依赖单元格区域作为SUMIF的数据源,现在改用数组替代后,核心是先将条件、求和数据存入数组,再通过循环或工作表函数完成匹配求和,最后一次性写入结果(避免循环操作单元格,提升效率)。
方案1:手动实现SUMIF逻辑(无依赖,更灵活)
适用于需要自定义匹配规则,或不想依赖工作表函数的场景:
Dim lngth As Long Dim arrLookup As Variant Dim arrCriteria As Variant Dim arrSum As Variant Dim arrResult As Variant Dim i As Long, j As Long ' 获取当前表待匹配的条件列(原I列,第9列) lngth = Cells(Rows.Count, 9).End(xlUp).Row arrLookup = Range("I2:I" & lngth).Value ' --- 替换为你的实际数组来源 --- ' 示例:若原数据从其他渠道获取,直接赋值arrCriteria和arrSum即可 arrCriteria = Sheet2.Range("A2:A1000").Value arrSum = Sheet2.Range("H2:H1000").Value ' 初始化结果数组(与待匹配条件数组同尺寸) ReDim arrResult(1 To UBound(arrLookup, 1), 1 To 1) ' 遍历匹配并累加求和 For i = 1 To UBound(arrLookup, 1) For j = 1 To UBound(arrCriteria, 1) If arrCriteria(j, 1) = arrLookup(i, 1) Then arrResult(i, 1) = arrResult(i, 1) + arrSum(j, 1) End If Next j Next i ' 一次性写入结果到L列 Range("L2:L" & lngth).Value = arrResult
方案2:用工作表函数直接处理数组
如果习惯用SUMIF逻辑,可直接传入数组参数:
Dim lngth As Long Dim arrLookup As Variant Dim arrCriteria As Variant Dim arrSum As Variant Dim arrResult As Variant Dim i As Long lngth = Cells(Rows.Count, 9).End(xlUp).Row arrLookup = Range("I2:I" & lngth).Value ' --- 替换为你的实际数组来源 --- arrCriteria = Sheet2.Range("A2:A1000").Value arrSum = Sheet2.Range("H2:H1000").Value ' 初始化结果数组 ReDim arrResult(1 To UBound(arrLookup, 1), 1 To 1) ' 遍历每个条件,调用SUMIF计算 For i = 1 To UBound(arrLookup, 1) arrResult(i, 1) = Application.WorksheetFunction.SumIf(arrCriteria, arrLookup(i, 1), arrSum) Next i ' 写入结果 Range("L2:L" & lngth).Value = arrResult
注意事项
- 数组维度:VBA中从单元格读取的数组为二维数组(即使是单列),访问格式为
数组名(行号, 列号);若为自定义一维数组,需调整循环逻辑。 - 效率优化:两种方案均采用“数组读数据→内存计算→一次性写结果”的模式,远优于原代码循环写入整列的操作。
内容的提问来源于stack exchange,提问作者Drawleeh
相关产品推荐
相关产品推荐

