Excel VBA中SUMIF函数跨表格匹配求和失败求助
问题原因与正确实现方式
原代码的核心问题是误用了VBA的Application.WorksheetFunction.SumIf——这个函数会返回单一计算结果,无法自动适配每行的条件,直接赋值给整个DataBodyRange会导致所有单元格都是同一个值,而非对应行的匹配求和结果。
要实现需求,需要给ADD列的每个单元格设置工作表原生的SUMIF公式,利用结构化引用或单元格引用让每行自动匹配对应条件。
正确代码实现(两种方式)
方式1:使用结构化引用(推荐,表格场景更直观)
Dim rsoTable As ListObject Dim espTable As ListObject ' 绑定两个表格对象 Set rsoTable = ThisWorkbook.Worksheets("RSO").ListObjects(1) Set espTable = ThisWorkbook.Worksheets("ESP").ListObjects(1) ' 给ADD列批量设置SUMIF公式,用外部引用指定RSO表格的列范围,[@Criteria]引用当前行的条件 espTable.ListColumns("ADD").DataBodyRange.Formula = _ "=SUMIF(" & rsoTable.ListColumns("RANGE").Range.Address(External:=True) & ", [@Criteria], " & rsoTable.ListColumns("RESULT").Range.Address(External:=True) & ")"
方式2:使用R1C1格式公式(灵活适配列位置变化)
Dim rsoTable As ListObject Dim espTable As ListObject Dim criteriaColOffset As Integer Set rsoTable = ThisWorkbook.Worksheets("RSO").ListObjects(1) Set espTable = ThisWorkbook.Worksheets("ESP").ListObjects(1) ' 计算Criteria列相对于ADD列的偏移量 criteriaColOffset = espTable.ListColumns("Criteria").Index - espTable.ListColumns("ADD").Index ' 用R1C1格式设置公式,自动适配每行条件 espTable.ListColumns("ADD").DataBodyRange.FormulaR1C1 = _ "=SUMIF('RSO'!" & rsoTable.ListColumns("RANGE").Range.Address(ReferenceStyle:=xlR1C1) & ", RC[" & criteriaColOffset & "], 'RSO'!" & rsoTable.ListColumns("RESULT").Range.Address(ReferenceStyle:=xlR1C1) & ")"
代码说明
- 两种方式都是给
ADD列的每个单元格写入工作表原生的SUMIF公式,而非用VBA计算单一值填充。 - 结构化引用
[@Criteria]会自动指向当前行的Criteria列单元格,确保每行匹配自身条件。 - 使用
Address(External:=True)或指定工作表的R1C1地址,避免因工作表切换导致的引用错误。
内容的提问来源于stack exchange,提问作者José Angel Bernal
相关产品推荐
相关产品推荐

