如何修改VBA代码实现类SUMIF的分组求和(规避SUMIF函数)
VBA实现多值匹配独立求和(替代SUMIF)
问题说明
需要实现类似SUMIF的求和逻辑,但不使用SUMIF函数:匹配P列(第16列)的每个目标值,将C列(第3列)中对应值的L列(第12列)数据单独求和,结果返回至P列右侧单元格(Q列)。现有VBA代码在单值输入时正常,但多值时会累加所有结果,无法按P列每个值拆分计算。
原代码
Sub sumif() Dim lastrow As Long Dim xlastrow As Long lastrow = Cells(Rows.Count, 1).End(xlUp).Row xlastrow = Cells(Rows.Count, 16).End(xlUp).Row For i = 3 To lastrow For y = 3 To xlastrow If Cells(i, 3).Value = Cells(y, 16).Value Then Count = Count + Cells(i, 12).Value Cells(y, 16).Offset(0, 1).Value = Count Next y Next i End Sub
修改后的代码
Sub sumif() Dim lastrow As Long Dim xlastrow As Long Dim Count As Double ' 显式声明计数器类型,避免变体类型问题 lastrow = Cells(Rows.Count, 1).End(xlUp).Row xlastrow = Cells(Rows.Count, 16).End(xlUp).Row ' 先遍历P列的每个目标值,单独计算对应求和 For y = 3 To xlastrow Count = 0 ' 每次计算新目标值前重置计数器,避免累加 For i = 3 To lastrow If Cells(i, 3).Value = Cells(y, 16).Value Then Count = Count + Cells(i, 12).Value End If Next i ' 计算完成后再赋值给Q列,减少单元格写入次数 Cells(y, 16).Offset(0, 1).Value = Count Next y End Sub
关键修改点
- 调整循环顺序:外层循环遍历P列的目标值,内层循环遍历数据源,确保每个目标值的求和独立进行
- 重置计数器:每次处理新的目标值时,将
Count重置为0,避免之前的求和结果累加影响当前值 - 优化赋值时机:完成当前目标值的所有匹配求和后,再写入对应单元格,减少不必要的单元格交互操作
- 显式声明变量类型:将
Count声明为Double,避免使用默认变体类型可能带来的计算误差
内容的提问来源于stack exchange,提问作者Jozef Skyrta
相关产品推荐
相关产品推荐

