VBA数组条件SUMIFS循环求和异常问题求助
问题排查与代码修正
核心问题分析
你的代码出现重复输出的原因是循环结构逻辑错误:
- 内层
For i循环(遍历criteria数组)每次循环都执行结果写入和k自增操作,导致每个跟踪号对应输出2次结果(数组含2个元素) TrackingNumber仅初始化时赋值一次,后续循环未更新,所有行使用同一个跟踪号For j循环的固定范围(3到50)未对应VBA表中跟踪号的实际行数,逻辑冗余
修正后的代码
Sub SumIfsMultipleCriteria() Dim sumRange As Range Dim criteriaRange1 As Range Dim criteriaRange2 As Range Dim Result As Double Dim i As Integer Dim k As Long Dim TrackingNumber As String Dim criteria As Variant Dim wsRaw As Worksheet Dim wsVBA As Worksheet ' 定义工作表对象,减少重复调用开销 Set wsRaw = ThisWorkbook.Sheets("UPS_All Raw Data Combined") Set wsVBA = ThisWorkbook.Sheets("VBA") ' 动态获取主表数据最后一行,避免固定行数限制 Dim lastRowRaw As Long lastRowRaw = wsRaw.Cells(wsRaw.Rows.Count, "N").End(xlUp).Row Set sumRange = wsRaw.Range("BA3:BA" & lastRowRaw) Set criteriaRange1 = wsRaw.Range("N3:N" & lastRowRaw) Set criteriaRange2 = wsRaw.Range("AT3:AT" & lastRowRaw) criteria = Array("Ground Residential", "Ground Commercial") k = 1 ' 从VBA表第2行开始输出结果 ' 遍历VBA表I列所有跟踪号,直到空行终止 Do While wsVBA.Range("I" & k + 1).Value <> "" TrackingNumber = wsVBA.Range("I" & k + 1).Value ' 若需模糊匹配跟踪号,取消下一行注释: ' TrackingNumber = "*" & TrackingNumber & "*" Result = 0 ' 每次计算前重置结果 ' 累加所有符合条件的金额 For i = 0 To UBound(criteria) Result = Result + WorksheetFunction.SumIfs(sumRange, _ criteriaRange1, TrackingNumber, _ criteriaRange2, criteria(i)) Next i ' 所有条件计算完成后,仅写入一次结果 wsVBA.Range("C" & k + 1).Value = Result k = k + 1 Loop End Sub
关键优化点
- 调整循环逻辑:每个跟踪号仅在完成所有criteria的金额累加后,写入一次结果,彻底解决重复输出问题
- 动态获取数据范围,避免固定行数导致的遗漏或无效循环
- 新增空行判断,自动遍历完所有跟踪号,无需手动指定循环范围
- 引入工作表对象,提升代码执行效率与可读性
内容的提问来源于stack exchange,提问作者Jay Love
相关产品推荐
相关产品推荐

