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

如何修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 07:09:39