SUMPRODUCT 做多条件计数求和
多条件统计,常见答案是 SUMIFS / COUNTIFS。但遇到这些情况它们就不好使了:
- 条件是"区间"或"排除某些值";
- 要对结果做跨表相乘再汇总;
- 不想写辅助列,也不想按 Ctrl+Shift+Enter。
SUMPRODUCT 能一次干完。
一、从求和说起
基本形式:
=SUMPRODUCT(数组1,数组2)
规则:逐位相乘,再把乘积相加。
=SUMPRODUCT({1;2;3},{10;20;30}) ' = 1×10 + 2×20 + 3×30 = 140
这就是"单价 × 数量"求和的最短写法:
=SUMPRODUCT(B2:B100,C2:C100)
二、加条件:把布尔值转成 1/0
比较运算产生 TRUE/FALSE,乘一下就变成 1/0:
=SUMPRODUCT((A2:A100="技术部")*(C2:C100))
A2:A100="技术部" 是一组 1/0,乘 C 列金额,再求和——等价于 SUMIF,但更灵活。
多条件:
=SUMPRODUCT((A2:A100="技术部")*(B2:B100="已付款")*(C2:C100))
条件可以任意多,不用管顺序,也不用管求和列在前在后。
三、数值型条件怎么转
文字比较天生产出布尔值,但 >100 这类条件如果写成直接比较也能用:
=SUMPRODUCT((B2:B100>100)*(C2:C100))
如果条件来自另一个单元格,注意不要用引号拼接:
=SUMPRODUCT((B2:B100>F1)*(C2:C100)) ' ✅ 直接比较
有人会写成 "&"">"&F1&"" 这类字符串再转换,又长又容易错。直接比较就够了。
四、排除条件
统计"除技术部以外的金额":
=SUMPRODUCT((A2:A100<>"技术部")*(C2:C100))
不等于、不包含都好写。排除多个值时用乘法连起来:
=SUMPRODUCT((A2:A100<>"技术部")*(A2:A100<>"财务部")*(C2:C100))
这在 SUMIFS 里得写好几组条件,SUMPRODUCT 一行搞定。
五、区间条件
按金额分档统计:
=SUMPRODUCT((C2:C100>=1000)*(C2:C100<5000)*(D2:D100))
SUMIFS 也能做多区间,但一旦同时有"包含文本"这类条件,SUMPRODUCT 更好写。
六、更复杂的:含文本判断
SUMPRODUCT 里可以套 ISNUMBER/SEARCH:
=SUMPRODUCT(--ISNUMBER(SEARCH("北京",E2:E100))*(C2:C100))
统计 E 列文本包含"北京"的金额。SUMIF 支持通配符可以写 "*北京*",但遇到多个关键词就难了:
=SUMPRODUCT((ISNUMBER(SEARCH("北京",E2:E100))+ISNUMBER(SEARCH("上海",E2:E100))>0)*(C2:C100))
+ 相当于"或",* 相当于"且"。这个规律记住,多复杂的条件都能拼出来。
七、几个约束必须知道
- 不能用整列引用:
SUMPRODUCT(A:A,B:B)会算到 104 万行,慢到卡死。必须写实际范围。 - 区域大小必须一致:
A2:A100和C2:C99会报#VALUE!。 - 区域内不能有错误值:只要有一个
#N/A,整个结果就是错误。用IFERROR或先清理。 - 结果的顺序无关:不要求排序,比
LOOKUP省心。
八、什么时候还是用 SUMIFS
不是所有场景都该用 SUMPRODUCT:
| 场景 | 建议 |
|---|---|
| 单纯多条件求和 | SUMIFS,更快 |
| 需要排除、包含、区间混合 | SUMPRODUCT |
| 数据量过十万行 | SUMIFS 或透视表 |
| 要相乘再汇总 | SUMPRODUCT |
| 条件复杂到要写辅助列 | SUMPRODUCT + 辅助列都行 |
性能上 SUMIFS 通常快数倍,因为它是专门优化的。别为了"公式优雅"牺牲掉响应速度。
九、速查
| 需求 | 写法 |
|---|---|
| 乘积求和 | =SUMPRODUCT(B2:B100,C2:C100) |
| 单条件求和 | =SUMPRODUCT((A2:A100="技术部")*C2:C100) |
| 多条件 | 条件之间用 * |
| 或条件 | 条件之间用 +,外面套 >0 或 -- |
| 排除 | (区域<>"值")* |
| 包含文本 | --ISNUMBER(SEARCH("关键词",区域)) |
SUMPRODUCT 真正的价值是"把逻辑写成表达式"。一旦你习惯用 * 和 + 表达与或,很多以前要建辅助列的问题都会消失。