课程
在 SUMIF() 和 SUMIFS() 等函数出现之前,SUMPRODUCT() 曾是 Excel 处理条件逻辑的主要工具之一。早在专门的条件函数推出之前,分析师就使用它来筛选数据、应用多重条件并计算加权结果。
即使在今天,SUMPRODUCT() 仍能处理一些新函数难以胜任的场景,尤其是在需要同时评估多个条件、数组或计算时。
尽管如此,它经常被忽视或误解。许多用户知道它的存在,但从未超越基础示例。
在本文中,您将学习如何使用 SUMPRODUCT() 进行条件和加权计算,并了解如何避免常见错误,从而在真实的 Excel 模型中自信地使用它。
理解 SUMPRODUCT()
SUMPRODUCT() 是一个 Excel 函数,用于将数组中对应的值相乘并对结果求和,使您可以在单个公式中完成复杂计算。尽管它常与高级分析联系在一起,但其最初的用途其实更为实用。
基本概念与基础语法
Excel 中的 SUMPRODUCT() 函数接收两个或更多区域,将它们的对应值相乘,并将结果汇总为一个最终数值。其核心目的,是将计算与聚合合并到一个公式中,消除对辅助列的需求。
这意味着无论包含多少个数组,SUMPRODUCT() 始终只返回一个数值结果。
SUMPRODUCT() 的语法为:
SUMPRODUCT(array1, [array2], …)
下面对该语法进行分解:
|
元素 |
说明 |
备注 |
|
|
用于计算的第一个区域或数组 |
必需 |
|
|
与 |
可选 |
|
|
您可以在同一公式中包含多个数组 |
所有数组必须对齐 |
使用 SUMPRODUCT() 时,请注意以下事项:
-
每个数组的行数和列数必须相同,因为
SUMPRODUCT()会按位置对齐项。 -
如果某个数组更长或形状不同,函数将无法正确匹配值,可能会抛出
#VALUE!错误。 -
空白单元格按零处理。
-
除非用于逻辑表达式,否则文本不参与计算。
默认行为:乘积与求和
默认情况下,SUMPRODUCT() 会将多个数组中的对应值相乘,然后将结果相加。先逐项相乘再求和,这是该函数的工作方式。
例如,若我们有一个包含数量与价格的简单数据集。如果 Quantity 列为数量,Price 列为价格,则下列公式可计算总收入:
=SUMPRODUCT(A2:A4, B2:B4)

Excel 中的 SUMPRODUCT()。作者供图。
在结果背后,Excel 会逐行计算,然后对结果求和:
- 第 1 行:2 × 50 = 100
- 第 2 行:3 × 30 = 90
- 第 3 行:1 × 20 = 20
随后 Excel 将这些值相加:100 + 90 + 20 = 210
这无需再创建手动计算行级合计的辅助列。SUMPRODUCT() 将整个计算封装在一个公式中,减少公式蔓延并降低引用错误的风险。
这种“先乘后加”的默认行为,为后续的高级用法(包括条件逻辑和加权计算)奠定了基础。
将 SUMPRODUCT() 扩展到基础之外
了解其原理后,让我们看看 SUMPRODUCT() 可以完成的一些进阶操作:
高级算术与运算符用法
SUMPRODUCT() 可在求和前,按行评估完整的算术表达式,包括加、减、乘、除。
当您在表达式中使用算术运算符(*、+、-、/)时,Excel 会先对每一行执行整个计算。例如,下面的公式计算总收入减去折扣:
=SUMPRODUCT((B2:B6*C2:C6)-E2:E6)
它会对每一行执行 Quantity × Price,再减去 Discount 值,最后将所有结果加总为一个总计。

在 SUMPRODUCT() 中使用算术表达式和运算符。作者供图。
不过,逗号的作用不同。当您用逗号分隔数组时,每个数组被视为独立输入,SUMPRODUCT() 会在求和前对这些数组的对应元素相乘。
若要使用逻辑条件,SUMPRODUCT() 依赖双一元运算符 --。像 A2:A6>100 这样的逻辑表达式会返回 TRUE 或 FALSE,在参与算术之前必须转换为 1 和 0。
双一元运算符可完成该转换:
=SUMPRODUCT(--(A2:A6>100), B2:B6)
在此示例中,只有条件为 TRUE 的行才会计入总计。
这种运算符的灵活性——将算术表达式、逻辑测试与数组配对结合起来——使 SUMPRODUCT() 在建模、报告,以及原本需要辅助列的场景中极具价值。
条件计算与逻辑条件
SUMPRODUCT() 可以在公式中直接评估逻辑条件。这些条件会生成 TRUE 与 FALSE 的数组,在参与计算前必须先转换为数字。
假设我们想汇总 Fruit 分类下产品的 Quantity。此时,如果您尝试使用公式 =SUMPRODUCT((D2:D6="Fruit"), B2:B6),结果会是 0。
为什么?因为像 D2:D6="Fruit" 这样的逻辑测试会产生 {TRUE, TRUE, FALSE, TRUE, FALSE}。
这些是逻辑值而非数字。由于 SUMPRODUCT() 执行的是数值运算,这些逻辑值必须转换为 1 和 0。双一元运算符 -- 就是执行该转换的工具:
--(D2:D6="Fruit")
这会将逻辑值转换为如下数字:
{1, 1, 0, 1, 0}
其中,TRUE 变为 1,FALSE 变为 0。现在 SUMPRODUCT() 就能正确相乘了。
=SUMPRODUCT(--(D2:D6="Fruit"), B2:B6)
其计算方式如下:
(1×5) + (1×3) + (0×4) + (1×2) + (0×6) = 10
只有标记为 1 的行会被纳入计算。结果为 10,即 Fruit 产品的总数量。

在 SUMPRODUCT() 中使用双一元运算符。作者供图。
处理多重条件(AND/OR 逻辑)
SUMPRODUCT() 可以使用 AND 与 OR 逻辑来处理多个条件。如下所示:
AND 逻辑:所有条件都必须满足
要应用 AND 逻辑,用 * 将条件相乘。因为只有 1 × 1 等于 1,所以仅当每个条件都为 TRUE 时,该行才会被包含:
=SUMPRODUCT(--(A2:A10>50)* --(B2:B10<100)* C2:C10)
您也可以用逗号分隔数组。默认情况下,SUMPRODUCT() 会对用逗号分开的数组进行相乘。但使用 * 能让 AND 逻辑更清晰。
=SUMPRODUCT(--(A2:A10>50), --(B2:B10<100), C2:C10)
在此示例中,仅当满足以下条件时,C 列的值才会被求和:
- A 列大于 50
- B 列小于 100
若任一条件不成立,该行计算结果为 0,将被排除。
OR 逻辑:任一条件满足即可
通过用 + 将条件相加可实现 OR 逻辑。只要任一条件为 TRUE,该行就会计入总计:
=SUMPRODUCT(--((A2:A10>50)+(B2:B10<100)), C2:C10)
此处,只要其中一个条件为 TRUE,行就会被包含。加法可能产生大于 1 的值,但双一元运算符 -- 会将任何非零结果转换为 1,确保每行只统计一次。

使用 SUMPRODUCT() 应用 AND 与 OR 逻辑。作者供图。
为何常优先选择 SUMPRODUCT() 而非 SUMIFS()
虽然 SUMIFS() 能很好地处理多个 AND 条件,但当条件跨越多列或混合数值与文本标准时,它无法原生评估 OR 逻辑或更复杂的模式。
SUMPRODUCT() 在以下场景中表现出色:
- 跨列应用 OR 逻辑
- 将数值阈值与文本条件结合
- 无需辅助列即可构建多列筛选
这种灵活性使 SUMPRODUCT() 成为高级筛选、建模与报告场景中的可靠之选,尤其当条件逻辑超出标准 SUMIFS() 规则时。
SUMPRODUCT() 的实用分析技巧
SUMPRODUCT() 不仅适用于简单计算;它也能胜任复杂分析。
按行与按列的条件应用
SUMPRODUCT() 可同时在行与列两个维度上应用条件。因此,处理矩阵或交叉表数据更为便捷。
与 INDEX/MATCH 仅返回单个值不同,它可以一次评估多个交叉点并返回合并结果。
这使得 SUMPRODUCT() 可以充当动态的双向查找,而无需辅助列或单独的查找公式。
假设您有一个按产品(行)与区域(列)排列的销售矩阵,您想计算 Apple 和 Banana 在 North 与 East 区域的总销售额。
可使用以下公式:
=SUMPRODUCT(
B2:E4 *
((A2:A4="Apple")+(A2:A4="Banana")) *
((B1:E1="North")+(B1:E1="East"))
)

SUMPRODUCT() 处理矩阵乘法。作者供图。
在该公式中:
-
B2:E4包含销售额 -
(A2:A4="Apple") + (A2:A4="Banana")创建纵向的行筛选器 -
(B1:E1="North") + (B1:E1="East")创建横向的列筛选器
满足条件的行与列会评估为 1,其余为 0。销售矩阵中的每个值会同时乘以其所在行与列的条件。
只有同时满足两类条件的单元格才会保持非零。
在本例中:
- Apple(North + East):120 + 110
- Banana(North + East):70 + 85
合计:385
这一模式适用于任何需要同时应用多重行与列条件的二维数据集,例如:
- 产品 × 区域
- 年份 × 类别
- 部门 × 成本类型
在这些场景中,SUMPRODUCT() 比传统查找函数更灵活,也避免了嵌套公式的复杂性。
加权平均计算
加权平均与 SUMPRODUCT() 天然契合,因为其计算过程正是函数的默认行为:将数值乘以权重,再对结果求和。
标准的加权平均公式如下:
(Sum of Score × Weight) ÷ (Sum of Weights)
但 SUMPRODUCT() 可通过一步同时完成乘法与求和,而无需创建辅助列。您可以直接计算加权总和,再除以权重之和:
=SUMPRODUCT(values, weights) / SUM(weights)
例如,要计算某位学生的课程加权平均,可以使用以下公式:
=SUMPRODUCT(B2:B4, C2:C4) / SUM(C2:C4)
Excel 将如下评估各组成部分:
- 数学:85 × 0.40 = 34
- 科学:90 × 0.35 = 31.5
- 英语:78 × 0.25 = 19.5
加权总分为 85,即最终平均分。

使用 SUMPRODUCT 计算加权平均。作者供图。
结合条件筛选或调整权重
当需要动态调整权重时,SUMPRODUCT() 的优势更为明显。
例如,您可以排除某些课程或为计算应用条件:
=SUMPRODUCT(B2:B6, C2:C6, --(D2:D6<>"Optional")) /
SUMPRODUCT(C2:C6, --(D2:D6<>"Optional"))
该公式用加权总和(分子)除以总权重(分母)。

使用 SUMPRODUCT 计算加权平均。作者供图。
在该公式中:
-
(D2:D6<>"Optional")返回{TRUE, TRUE, FALSE, TRUE, FALSE} -
--(D2:D6<>"Optional")转换为{1, 1, 0, 1, 0} -
分子:
(85×0.25×1) + (90×0.25×1) + (78×0.20×0) + (88×0.20×1) + (92×0.10×0) = 21.25 + 22.50 + 0 + 17.60 + 0 = 61.35 -
分母:
(0.25×1) + (0.25×1) + (0.20×0) + (0.20×1) + (0.10×0) = 0.70
在这种模式下,只有满足条件的行才同时贡献于加权总和与总权重。这样无需重构数据或新增辅助列即可保持计算准确。
由于加权平均依赖于逐行乘法再求和,SUMPRODUCT() 常是评分模型、投资组合加权和绩效评分中最直接、最灵活的工具。
高级应用与复杂场景
SUMPRODUCT() 的一大优势在于它能轻松与其他 Excel 函数组合使用。由于其按行评估计算,它可以将文本函数、查找结果和逻辑测试转化为数值输入,以实现灵活分析。
我们来看几个例子。
将 SEARCH() 与 SUMPRODUCT() 配合实现部分文本匹配
若要匹配包含某个词或短语的文本,可将 SUMPRODUCT() 与 SEARCH() 和 ISNUMBER() 搭配:
=SUMPRODUCT(--ISNUMBER(SEARCH("Apple", A2:A5)), B2:B5)
在此公式中:
-
SEARCH()在找到匹配时返回数字 -
ISNUMBER()将匹配转换为TRUE/FALSE -
--将这些值转换为1与0
只有包含“Apple”的行才会参与总计。

将 SUMPRODUCT() 与 SEARCH() 结合使用。作者供图。
将 EXACT() 与 SUMPRODUCT() 配合实现区分大小写的匹配
默认情况下,Excel 的文本比较不区分大小写。当大小写敏感时,您可以在 SUMPRODUCT() 中使用 EXACT(),如下所示:
=SUMPRODUCT(--EXACT(A2:A5,"Apple"), B2:B5)
这可确保只有在大小写完全一致时,文本才会被纳入计算。

将 SUMPRODUCT() 与 EXACT() 结合使用。作者供图。
将 VLOOKUP() 与 SUMPRODUCT() 配合使用
SUMPRODUCT() 也可以在逻辑中评估查找结果。与 VLOOKUP() 结合时,它可以基于另一张表中的值进行条件计算:
=SUMPRODUCT(
(VLOOKUP(A2:A5, D2:E5, 2, FALSE)="Fruit") *
B2:B5
)
此处,VLOOKUP() 会为每个产品返回其类别,SUMPRODUCT() 只会纳入与指定条件匹配的行。该方法无需辅助列,并且比传统的 SUMIF() 公式支持更灵活的基于查找的筛选。

将 SUMPRODUCT() 与 VLOOKUP() 结合使用。作者供图。
将 COUNTIF() 与 SUMPRODUCT() 配合统计唯一值
您也可以将 SUMPRODUCT() 与 COUNTIF() 配合,像这样统计唯一值:
=SUMPRODUCT(1/COUNTIF(A2:A6, A2:A6))

将 SUMPRODUCT() 与 COUNTIF() 结合使用。作者供图。
在该公式中,重复值会分享加起来为 1 的分数权重,因此每个唯一项只计数一次。这就是结果为 3 的原因。
尽管已有更新函数,这一技巧在较旧版本的 Excel 或复杂数组模型中仍然有用。
故障排查、优化与最佳实践
了解了 SUMPRODUCT() 的用法与适用场景后,以下是您可能遇到的几个挑战及其解决方法:
错误处理与常见问题
多数 SUMPRODUCT() 错误源自细微的结构问题,而非逻辑错误。当公式返回 0、异常总计或错误时,问题通常易于定位:
数组大小不匹配
在 SUMPRODUCT() 中使用的每个数组必须拥有相同的行数与列数。若某个区域比其他区域更长或更宽,公式将无法正确评估。
快速检查:确认所有引用区域在相同行与列开始和结束。
意外文本或隐藏字符
SUMPRODUCT() 执行的是数值运算。若某个看似数值的区域包含空格或文本,计算可能返回不正确的结果或零。
快速修复:使用 TRIM() 去除多余空格,或在适当时用 -- 强制进行数值转换。
括号位置错误
括号决定了计算顺序。缺少或错误放置括号会导致条件被错误应用或完全未生效。
快速修复:在与算术或其他条件组合前,清晰地分组每个逻辑测试。
逐步测试中间逻辑
调试 SUMPRODUCT() 公式的最快方法之一是逐一评估各个组成部分。
具体操作如下:
- 选中公式的一部分,例如
(A2:A10>50) - 按下 F9
- 查看输出
正常的条件会返回干净的 TRUE/FALSE 数组;若已转换,则为 1/0。如果出现错误或意外结果,则可认为该片段是问题来源。
实用的调试流程
当 SUMPRODUCT() 公式未按预期运行时:
- 核对数组尺寸是否一致
- 确认数值区域只包含数字
- 独立测试每个条件
- 逐步重建公式
这种方法通常能快速解决问题,无需重写整个公式或添加辅助列。
性能优化
SUMPRODUCT() 会评估所引用数组中的每个单元格,因此在大型工作簿中,公式结构会直接影响性能。但通过一些选择可避免变慢:
限制计算范围
避免使用整列引用,如 A:A。请将公式限制在尽可能小的范围内,如 A2:A500。
更小的范围可减少 SUMPRODUCT() 需要处理的单元格数量,并提高重算速度。
简化逻辑表达式
SUMPRODUCT() 中的每个逻辑测试都要逐行评估。因此,尽量在可行时合并或精简条件,从而减少总运算次数。
如果两个条件可表述为一条更简洁的规则,就能在不改变结果的情况下提升性能。
使用结构化表或动态命名范围
Excel 表与动态命名范围会在数据增长时自动调整,同时保持范围紧凑。这样既维持性能,也无需在数据集扩张时修改公式。
注意大型数组
每增加一个数组与条件,都会增加计算负担。在大型模型中,避免不必要的条件,并移除对结果无直接影响的数组。
在 Excel 365 中使用动态数组
在 Excel 365 中,SUMPRODUCT() 本身不会产生溢出结果,但它能与 FILTER() 或 UNIQUE() 等函数生成的溢出数组可靠配合。这使您可以将动态数组输出与 SUMPRODUCT() 结合,同时保持计算稳定可控。
对于大型且溢出较多的模型,考虑是否可以用动态数组函数替代部分逻辑。但当需要逐行乘法与条件加权时,SUMPRODUCT() 依然是更佳选择。
将 SUMPRODUCT() 与替代函数对比
SUMPRODUCT() 与多个 Excel 函数存在交集,但其解决问题的方式不同。如下所示:
SUMPRODUCT() 与 SUMIF() / SUMIFS()
SUMIF() 与 SUMIFS() 在处理简单条件时快速高效。它们最适用于:
- 标准简单
- 精确匹配
- 严格的 AND 逻辑
SUMPRODUCT() 用灵活性换取了一些速度。当计算需要:
- 部分文本匹配
- OR 逻辑或混合条件
- 基于计算的条件而非静态区域
- 无需辅助列即可实现复杂逻辑
对于规则简单的数据集,SUMIFS() 通常更快。但当精确性与可控性比速度更重要时,SUMPRODUCT() 更合适。
SUMPRODUCT() 与经典数组公式
传统数组公式可完成许多相同的计算,但需要 Ctrl+Shift+Enter (CSE),且更难维护。
SUMPRODUCT() 完全不需要 CSE,并且表现如同标准 Excel 函数。这使其在协作或商业环境下更易阅读、编辑与共享,因为用户可能不熟悉数组公式。
SUMPRODUCT() 与现代动态数组函数
新的函数如 FILTER()、UNIQUE() 与 BYROW() 擅长返回溢出结果、重塑数据并生成可见的列表或表格。
但在以下情况中,SUMPRODUCT() 仍然有价值:
- 您需要单个数值结果
- 逻辑必须封装在一个单元格中
- 计算依赖逐行乘法与加权
- 需要向后兼容
动态数组往往是对 SUMPRODUCT() 的补充而非替代,例如生成由 SUMPRODUCT() 进一步评估的已筛选数组。
何时选择 SUMPRODUCT()
当您需要:
-
带有复杂逻辑的条件合计
-
OR条件或基于计算的标准 -
无需辅助列的加权计算
-
单一且稳定的结果单元格
|
函数 |
最佳用例 |
优势 |
局限 |
|
|
返回单个数值的复杂条件计算 |
逻辑灵活 支持 OR 条件 加权计算 无需辅助列 |
在超大范围上较慢 |
|
|
简单的条件合计 |
快速 高效 易读 |
逻辑受限 不支持 OR 条件 |
|
经典数组公式 |
旧版 Excel 模型中的高级计算 |
灵活 |
需要 Ctrl+Shift+Enter 维护更难 |
|
|
返回已筛选的列表或表格 |
动态结果 逻辑可读 |
不适合加权运算 |
|
|
提取不重复值 |
简单 快速 |
无计算逻辑 |
|
|
行级自定义逻辑 |
高度灵活 现代模式 |
设置更复杂 |
|
|
单值查找 |
精确 高效 |
返回单个值 不做聚合 |
跨平台实现
SUMPRODUCT() 背后的核心逻辑——筛选、相乘、求和——在各工具中是一致的。不同之处在于各平台如何处理逻辑值与数组。
Excel 与 Google 表格的差异
Excel 与 Google 表格 均支持 SUMPRODUCT(),但二者在细节上有所不同,尤其在逻辑值处理方面。
在 Excel 中,逻辑表达式返回 TRUE 与 FALSE,需要通过双一元 -- 或数值强制转换显式转为 1 与 0。若不进行转换,计算可能返回意外结果。
Google 表格会自动完成该转换。逻辑值被视为数值(TRUE = 1,FALSE = 0),因此 SUMPRODUCT() 公式可在无需额外运算符的情况下工作。
从概念上看,逻辑一致。差异仅在于数值转换是隐式还是显式。
将 SUMPRODUCT() 逻辑迁移到 Python
同样的模式适用于基于 Python 的工具,如 NumPy 或 pandas,尽管语法不同。
在 Python 中,条件会按行评估,并生成布尔数组(True 与 False)。这些布尔值在计算中本就表现为 1 与 0,因此无需转换步骤。
概念流程保持一致:
- 评估条件
- 创建布尔掩码
- 用该掩码对数值加权相乘
- 对结果求和
跨平台团队的注意事项
如果您或您的团队跨 Excel、Google 表格与 Python 协作,请在以下关键行为上达成一致:
-
布尔逻辑是通用语言:所有平台都使用 TRUE/FALSE 风格的逻辑,可作为数值掩码处理。
-
掩码可替代辅助列:Excel 使用
--(condition),Python 直接使用布尔掩码。 -
文本匹配规则不同:Excel 的
SEARCH()等函数默认不区分大小写,而 Python 的文本匹配是否区分大小写取决于配置。 -
缺失值行为不同:Excel 的空白 与 Python 的 NaN 值可能影响结果,除非一致处理。
跨平台时,核心理念保持不变:SUMPRODUCT() 代表一种可复用的计算模式。
结语
若想更熟练地掌握 SUMPRODUCT(),请选择一个您已在用的真实报告,尝试在不依赖辅助列的情况下重建一个复杂公式。这样您就能理解其模式,并看到 SUMPRODUCT() 在您的工作流程中可以发挥的作用。
如果您想更进一步,请查看 Data Analysis with Excel Power Tools 技能路径,了解像 SUMPRODUCT() 这样的函数如何融入更广泛的分析流程。
我是内容策略专家,热衷于将复杂主题化繁为简。我曾帮助 Splunk、Hackernoon 和 Tiiny Host 等公司为其受众打造兼具吸引力与信息量的内容。
SUMPRODUCT() 常见问题
SUMPRODUCT() 在对数字求和时如何忽略文本值?
SUMPRODUCT() 不会自动处理文本值。因此,文本必须在计算前转换为零。可使用 IFERROR() 将所有非数值转换为零。
=SUMPRODUCT((criteria_range=criteria)*(--ISNUMBER(value_range)), value_range)
SUMPRODUCT() 是否支持通配符?
不支持。通配符(如 * 与 ?)不被直接支持。您必须在 SUMPRODUCT() 中结合 LEFT()、RIGHT() 或 FIND() 等函数来模拟通配符行为。
如何让 SUMPRODUCT() 动态选择列?
您可以将 SUMPRODUCT() 与 INDEX()、MATCH() 配合,根据输入单元格动态确定起止列,从而让 SUMPRODUCT() 具有动态性。
