Menu

Excel SUMPRODUCT 函数:相乘求和与按条件计数

=SUMPRODUCT(B2:B6,C2:C6) 把每个数量乘以对应的单价,再把结果加起来。配合 (A2:A7="North")*C2:C7 这样的条件,它能完成 SUMIFS 做不到的求和与计数:按月份、两列比较、“或”条件。

本页的每张表格都是实时的:修改数字或公式,就会重新计算。

=SUMPRODUCT(B2:B6,C2:C6) 把 B 列中的每个数量乘以旁边 C 列中的单价,再把结果加起来。它在一个单元格中就给出订单总额,不需要一列小计。

订单总额
F2
ABCDEF
1ItemQtyPriceLine totalTotal
2Pen4$1.50$6.00$30.70
3Notebook2$3.25$6.50$30.70
4Folder5$0.80$4.00
5Stapler1$7.90$7.90
6Marker3$2.10$6.30
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

F2 和 F3 都显示 $30.70。D 列中的小计只是为了说明 SUMPRODUCT 做了什么:4 × 1.50、2 × 3.25,依此类推,最后求和。修改某个数量,两个合计都会跟着变。

SUMPRODUCT 的语法

=SUMPRODUCT(array1, [array2], [array3], ...)
  • 每个数组是一个区域,或者能得到区域的计算,所有数组的大小都必须相同,否则 SUMPRODUCT 返回 #VALUE!。
  • 有两个或更多数组时,相同位置上的值相乘,然后把乘积加起来。
  • 只有一个数组时,它只是把这个数组加起来,下面的条件写法正是利用了这一点:=SUMPRODUCT((A2:A7="North")*C2:C7) 只有一个已经相乘过的数组。
  • 作为单独参数传入的文本算作 0。* 计算中的文本会导致 #VALUE!。

在所有 Excel 版本中,SUMPRODUCT 都能直接处理数组,不需要按 Ctrl+Shift+Enter(Mac 上按 Cmd+Shift+Enter),所以在 SUMIFS 出现之前,它是条件求和的标准工具,在 SUMIFS 处理不了的情况下至今仍是。

带条件的 SUMPRODUCT

对区域做比较,比如 A2:A7="North",每一行返回一个 TRUE 或 FALSE。乘以它,就会保留结果为 TRUE 的行(×1),并把其他行变成 0(×0)。把两个比较相乘就是“且”。

按条件求和与计数
F2
ABCDEF
1RegionProductSalesFormulaResult
2NorthApple120North sales230
3SouthPear45North Apple sales150
4NorthPear80Count North3
5EastApple55Count over 504
6SouthApple200Without --0
7NorthApple30
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

F2 把 North 的三行加起来:230。F3 把两个条件相乘,所以只有两个条件都成立的行才会被计入:150。要计数而不是求和,就去掉数值,再用 --(两个负号)把 TRUE/FALSE 变成数字:F4 统计出 3 行 North。F6 说明了 -- 为什么重要:SUMPRODUCT 不会把 TRUE 值加起来,所以不加它的公式返回 0。

前四个公式的结果和 SUMIF、SUMIFS、COUNTIF 相同。下一节才是 SUMPRODUCT 真正发挥作用的地方。

SUMIFS 无法表达的条件

SUMIFS 把一列和一个固定的条件比较。它不能取日期的月份,不能让两列互相比较,也不能在相加之前先把数量乘以单价。SUMPRODUCT 可以,因为每个条件都只是普通的计算。

超出 SUMIFS 的能力
G2
ABCDEFG
1RegionDateTargetActualFormulaResult
2North2026-01-05100120February sales135
3South2026-01-126045Rows over target3
4North2026-02-039080North or East sales285
5East2026-02-185055Above target by75
6South2026-03-02150200
7North2026-03-204030
点击单元格查看它的公式。修改数字或公式,表格会重新计算。
  • G2 取每个日期的 MONTH,保留 2 月的行:80 + 55 = 135。它会把任何年份的 2 月都加进来;只要某一年时,再乘上 *(YEAR(B2:B7)=2026)。
  • G3 逐行比较两列,统计 Actual 超过 Target 的行数。
  • G4 是“或”:把两个条件相加,任一条件成立时得到 1(两个都成立时得到 2,所以要加上 >0)。North 或 East:285。
  • G5 把超出目标的各行超出了多少加起来,只计算超出目标的行。

用 SUMPRODUCT 计算加权合计和加权平均值

数量乘以单价就是加权合计,还可以在上面加条件。同样的思路再除以权重之和,就得到 加权平均值:=SUMPRODUCT(B2:B6,C2:C6)/SUM(B2:B6) 是每件售出商品的平均单价。

各地区的收入
G2
ABCDEFG
1RegionProductQtyPriceFormulaResult
2NorthApple10$1.20North revenue$31.00
3SouthPear4$1.50All revenue$61.00
4NorthPear6$1.50Average price per item$1.36
5EastApple8$1.20
6SouthApple12$1.20
7NorthPlum5$2.00
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

North 以 1.20卖出10个苹果,以1.20 卖出 10 个苹果,以 1.50 卖出 6 个梨,以 2.00卖出5个李子,所以G2显示2.00 卖出 5 个李子,所以 G2 显示 31.00。直接对单价求平均,会把李子当作和苹果卖得一样多;G4 则用数量给每个单价加权。

练习:带条件的收入

轮到你了:South 的收入
G2
ABCDEFG
1RegionProductQtyPriceFormulaResult
2NorthApple10$1.20South revenue
3SouthPear4$1.50
4NorthPear6$1.50
5EastApple8$1.20
6SouthApple12$1.20
7NorthPlum5$2.00
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

轮到你了: 计算 South 的收入:数量乘以单价,只计算 South 的行。在 G2 中写公式。

SUMPRODUCT 和 SUMIFS 的对比,以及两种常见错误

条件SUMIFSSUMPRODUCT
某列等于某个值=SUMIFS(C2:C7,A2:A7,"North")=SUMPRODUCT((A2:A7="North")*C2:C7)
包含某段文本=SUMIFS(C2:C7,B2:B7,"*app*")=SUMPRODUCT(ISNUMBER(SEARCH("app",B2:B7))*C2:C7)
日期的月份无法直接实现=SUMPRODUCT((MONTH(B2:B7)=2)*D2:D7)
两列比较无法实现=SUMPRODUCT(--(D2:D7>C2:C7))
数量 × 单价无法实现=SUMPRODUCT(C2:C7,D2:D7)

只要 SUMIFS 能完成,就优先用它。它更易读,在几万行数据上更快,而且接受整列引用。=SUMPRODUCT((A:A="North")*C:C) 要对一百多万行做乘法,一碰到 C1 中的标题文本就会返回 #VALUE!,所以要给 SUMPRODUCT 精确的区域,比如 A2:A500。

你会遇到的两种错误:

  • 区域大小不同导致的 #VALUE!。 =SUMPRODUCT(B2:B6,C2:C7) 会出错。每个区域都必须覆盖相同的行。
  • 相乘的区域中有文本导致的 #VALUE!。 C2:C7 中的标题或“n/a”会让 (A2:A7="North")*C2:C7 出错,因为文本不能相乘。让区域从标题下方开始,或者把数值作为单独的参数传入:=SUMPRODUCT(--(A2:A7="North"),C2:C7) 会把 C 列中的文本当作 0。

常见问题

Excel 中的 SUMPRODUCT 是做什么的?

它把几个区域逐行相乘,再把乘积加起来。=SUMPRODUCT(B2:B6,C2:C6) 就是 B2C2 + B3C3 + ... + B6*C6,比如把数量乘以单价,汇总成订单总额。

SUMPRODUCT 怎样带条件使用?

乘以一个比较:=SUMPRODUCT((A2:A7="North")*C2:C7) 对 North 各行的 C2:C7 求和。比较得到 TRUE 或 FALSE,相乘时它们分别变成 1 或 0。

SUMPRODUCT 中的 -- 是什么意思?

这是两个负号,它把 TRUE 和 FALSE 变成 1 和 0。=SUMPRODUCT(--(C2:C7>50)) 统计大于 50 的值的个数。不加它的话,SUMPRODUCT 会把 TRUE/FALSE 当作 0,返回 0。

该用 SUMPRODUCT 还是 SUMIFS?

SUMIFS 的条件能表达时就用 SUMIFS:它更容易读懂,在大区域上也更快。条件需要计算时就用 SUMPRODUCT,比如日期的月份、一列与另一列比较,或者数量乘以单价。

SUMPRODUCT 为什么返回 #VALUE!?

区域的大小不同(B2:B6 和 C2:C7),或者用 * 相乘的区域中有文本。让每个区域的大小相同,并把含文本的区域作为单独的参数传入,这样文本会被当作 0。

Coddy 编程语言插图

和 Coddy 一起学编程

开始