在Excel ListObject中使用VBA WorksheetFunction SumIfs返回0的问题
解决Excel ListObjects中SumIfs返回0的问题
核心问题出在DataBodyRange的行索引使用错误:VBA里ListObject的DataBodyRange单元格索引是从1开始的,你代码里写的DataBodyRange(0, 列号)会指向无效区域,导致SumIfs根本找不到匹配的数据源,自然返回0。
修正后的代码如下:
Sub example() Set Tabela = ActiveSheet.ListObjects("Tb_ConsolidaPeriodo") TabLin = Tabela.ListRows.Count Dim var As Variant For Lin = 1 To TabLin ' 把所有DataBodyRange的行索引从0改成1 var = Application.WorksheetFunction.SumIfs( _ Tabela.DataBodyRange(1, 15), _ Tabela.DataBodyRange(1, 2), Tabela.DataBodyRange(Lin, 2), _ Tabela.DataBodyRange(1, 11), Tabela.DataBodyRange(Lin, 11)) ' 直接赋值Value,比FormulaR1C1更合适 Tabela.DataBodyRange(Lin, 16).Value = var Next Lin End Sub
额外优化建议:
- 用ListColumns的名称代替硬编码的列号,比如
Tabela.ListColumns("你的列名").DataBodyRange,这样代码可读性更高,后续表格列顺序变动也不会出错 - 如果担心没有匹配项导致SumIfs报错,可以改用
Application.SumIfs(去掉WorksheetFunction),这样没有匹配时会返回错误值,你可以用IsError判断后处理
内容的提问来源于stack exchange,提问作者Andrea Caixeta
相关产品推荐
相关产品推荐

