跳至主要内容

Excel 中的 SUBTOTAL() 公式:完整计算指南

了解 SUBTOTAL() 如何对已筛选或分组的数据进行动态汇总。掌握其语法、实用示例,并与相近函数进行比较。
· 9分钟 阅读

使用 AI 探索

Excel 用户常常需要能够随筛选或分组而变化的灵活汇总方式。传统函数如 SUM()、AVERAGE() 或 COUNT() 会基于区域内的所有单元格计算结果,而不管某些行是否被隐藏或筛除。SUBTOTAL() 提供了一种动态替代方案,可根据工作表当前可见内容自动调整计算结果。

如果您刚接触 Excel,想在学习 SUBTOTAL() 等高级函数前先打好基础,我们提供的 Introduction to Excel 课程涵盖工作表导航、基础公式和数据格式设置等核心技能,为更高阶的 Excel 应用做好准备。

什么是 Excel 中的 SUBTOTAL() 函数?

SUBTOTAL() 用于对数据集执行求和、平均、计数及其他统计运算。与标准 Excel 函数不同之处在于它具有动态特性——会根据可见或被筛选的内容改变结果。根据您指定的函数编号,它可以忽略手动隐藏的行以及通过筛选隐藏的行。

当您对数据应用筛选或手动隐藏某些行时,SUBTOTAL() 会自动调整,只对可见单元格进行计算。这使其非常适合在筛选数据集中创建汇总行、构建交互式仪表板,或生成需根据用户选择实时更新的报告。

该函数支持与 Excel 标准函数相同的统计运算——包括求和、平均、计数、最大值、最小值等——但将它们打包成一个可感知上下文、能随数据当前状态自适应的函数。

语法与支持的运算

SUBTOTAL() 的语法结构十分直观:

=SUBTOTAL(function_num, ref1, [ref2], ...)

第一个参数 function_num 同时决定计算类型以及对隐藏行的处理方式。其余参数(ref1、ref2 等)为要参与计算的单元格区域。最多可指定 254 个不同区域。

根据对手动隐藏行的处理方式,函数编号分为两类:

函数编号

运算

包含手动隐藏的行

排除手动隐藏的行

1 / 101

AVERAGE

1

101

2 / 102

COUNT

2

102

3 / 103

COUNTA

3

103

4 / 104

MAX

4

104

5 / 105

MIN

5

105

6 / 106

PRODUCT

6

106

7 / 107

STDEV

7

107

8 / 108

STDEVP

8

108

9 / 109

SUM

9

109

10 / 110

VAR

10

110

11 / 111

VARP

11

111

函数编号 1-11 在计算中包含手动隐藏行,而 101-111 则排除手动隐藏行。但两组编号都会忽略通过筛选隐藏的行。

例如,SUBTOTAL(9, A2:A10) 会对 A2:A10 求和并包含任何手动隐藏行,而 SUBTOTAL(109, A2:A10) 则在求和时排除手动隐藏行。两种情况下,被筛选隐藏的行都会自动被排除在结果之外。

SUBTOTAL() 实战示例

下面通过一家电子与家具商店的销售数据示例来了解 SUBTOTAL() 的实际效果。

Excel 中的 SUBTOTAL 函数

未筛选数据集。图片来源:作者。

示例数据包含 7 个产品,分属两类——4 个电子产品(Laptop、Phone、Tablet、Monitor)和 3 个家具产品(Desk、Chair、Lamp)。在未应用筛选时,SUBTOTAL(109,C2:C8) 与常规 SUM(C2:C8) 的结果相同:3525(所有销售额之和)。

结合 SUBTOTAL 对数据集进行筛选已筛选数据集。图片来源:作者。

现在我们应用筛选,仅显示电子产品,隐藏了 3 行家具产品。请注意计算结果的关键差异:

  • SUBTOTAL 公式 显示为 3000 ——自动仅对可见的电子产品行求和
  • 常规 SUM 公式 仍显示 3525 ——继续包含被隐藏的家具产品

这一对比清楚展示了 SUBTOTAL() 的核心优势:它能对筛选与可见性变化作出动态响应,而 SUM() 等传统函数则保持静态。当您筛选数据或隐藏行时,SUBTOTAL() 会即时重新计算,仅反映当前可见内容,非常适用于响应式仪表板和交互式报告。

SUBTOTAL() 与隐藏/筛选数据的协同方式

SUBTOTAL() 对不同类型的隐藏数据有特定处理方式,在构建公式时了解这些行为非常重要。

配合筛选行的 SUBTOTAL()

当您对数据集应用筛选时,无论使用哪个函数编号,SUBTOTAL() 都会将被筛除的行排除在计算之外。此行为在所有函数编号(1-11 与 101-111)中都是自动且一致的。

例如,若您拥有 1 至 12 月的销售数据,并筛选仅显示一季度(1、2、3 月),SUBTOTAL(9, B2:B13) 将只对这三个月(可见项)求和,忽略被筛除的二至四季度数据。

配合手动隐藏行的 SUBTOTAL()

对于手动隐藏的行(右键行号并选择“隐藏”),处理方式取决于您选择的函数编号。

使用编号 1-11 时,计算会包含这些手动隐藏行;使用编号 101-111 时,则会将其排除。这样您可以自行控制隐藏数据是否影响结果。

SUBTOTAL() 与横向/纵向区域

SUBTOTAL() 最适合纵向数据区域(按列排列)。虽然它也能处理横向区域,但其隐藏逻辑针对基于行的操作进行了优化,因为 Excel 的筛选与隐藏功能是纵向工作的。

当您在同一区域内嵌套多个 SUBTOTAL() 公式时,函数会自动跳过其他 SUBTOTAL() 的结果以避免重复计数。这在创建层级汇总或分组小计时尤其实用,确保总计准确反映各自的独立分组且不重复。

SUBTOTAL() 的高级用法

使用 SUBTOTAL() 创建动态下拉汇总

您可以将 SUBTOTAL() 与 IF() 组合,创建随用户选择而变化的交互式汇总。该方法通过下拉列表让用户在不同计算类型间切换。

首先在 D1 单元格设置下拉选项,如 "Sum"、"Average"、"Count" 和 "Max"。

然后在另一个单元格(如 D2)使用以下公式,根据用户选择动态调整计算:

=IF(D1="Sum",SUBTOTAL(109,A2:A10),
  IF(D1="Average",SUBTOTAL(101,A2:A10),
  IF(D1="Count",SUBTOTAL(103,A2:A10),
  IF(D1="Max",SUBTOTAL(104,A2:A10),"Select Option"))))

该公式会判断下拉选择,并应用相应的 SUBTOTAL()。用户无需修改公式即可在不同计算类型间切换,使报告更具交互性且更易用。

Excel 表格与分级显示中的 SUBTOTAL()

Excel 表格在“总计行”功能中会自动使用 SUBTOTAL()。当您将数据区域转换为表格(Ctrl+T)并启用总计行时,Excel 在求和时默认插入 SUBTOTAL(109, …)。每当筛选行变化时,该总计行都会动态更新,只反映可见数据。

您可以通过单击总计行单元格中的下拉箭头并选择 Count、Average、Max、Min 等选项来更改计算类型。Excel 会在保持 SUBTOTAL() 结构的同时自动更新函数编号。

“分级显示”(数据 > 分类汇总)功能同样依赖 SUBTOTAL()。当您对数据进行分组并插入小计时,Excel 会在每个分组断点自动放置 SUBTOTAL(),从而创建层级汇总。在展开或折叠分级时,函数会正确忽略嵌套的小计结果。

常见陷阱与限制

了解 SUBTOTAL() 的常见错误与限制,有助于避免计算失误,并为您的数据分析选择合适的方法。

  • 无效函数编号导致 #VALUE! 错误: 最常见的错误发生在使用无效的函数编号时。SUBTOTAL() 仅接受 1-11 和 101-111 这两组函数编号。使用 12、50 或 200 等数字会返回 #VALUE! 错误。务必确认您的编号对应受支持范围内的有效运算。

  • 隐藏列与隐藏行的差异: SUBTOTAL() 对隐藏行的响应取决于函数编号,但对隐藏列并不相同。无论使用 1-11 或 101-111,函数都会将隐藏列中的数据计入计算。这一限制意味着,当列可见性会影响分析时,您需要采用替代方法。

  • 不支持三维引用(3D 引用): 与许多 Excel 函数不同,SUBTOTAL() 无法引用跨多工作表的区域。类似 SUBTOTAL(109, Sheet1:Sheet3!A1:A10) 的公式会报错。变通方法是先在各工作表上分别用 SUM() 等标准函数计算汇总,再在汇总表上用单个 SUBTOTAL 合并这些中间结果。

  • 错误值会参与计算: SUBTOTAL() 不会忽略包含 #N/A、#DIV/0! 或 #VALUE! 等错误值的单元格。这些错误会在小计计算中传播,可能导致整体结果失效。在应用 SUBTOTAL() 前请清理错误,或考虑使用可跳过错误值的 AGGREGATE()。

  • 纵向数据效果最佳: 虽然 SUBTOTAL() 也能处理横向区域,但其设计更适配纵向数据结构。Excel 的筛选、排序与隐藏按行工作,使纵向排列更契合该函数的预期行为。

Subtotal() 与 AGGREGATE()

AGGREGATE() 是 SUBTOTAL() 的增强替代,具备更多统计运算并能更好地处理错误。SUBTOTAL() 提供 11 种基础运算,而 AGGREGATE() 提供 19 种函数,包括百分位数、四分位数和中位数等计算。

AGGREGATE() 的主要优势在于其错误处理能力。与会将错误值计入计算的 SUBTOTAL() 不同,AGGREGATE() 可自动跳过包含 #N/A、#DIV/0! 或 #VALUE! 等错误的单元格。这使其在处理不完整或存在问题的数据集时尤为实用。

AGGREGATE() 还提供更精细的忽略控制。您可以通过其选项参数配置是否跳过隐藏行、嵌套小计、错误值,或这些元素的任意组合。

使用 SUBTOTAL() 的专业提示

先排序,再分类汇总

使用“数据 > 分类汇总”前,请先按分组列对数据排序。这样可将相关记录聚拢,形成干净的分组断点。未排序的数据会产生分散的小计,难以形成有意义的汇总。

在各列首行使用标签

在应用小计前,请为数据区域的首行设置清晰的表头。Excel 会使用这些标签生成更有意义的小计描述,也便于解读报告。清晰的列标题还能帮助您选择用于手动 SUBTOTAL() 公式的区域。

注意汇总位置(上方或下方)

Excel 的分类汇总工具默认将汇总行放在每个分组下方,您也可以选择放在上方。请根据报告用途进行选择:在上方的汇总适合管理层仪表板,而在下方的汇总更符合传统会计格式。

区分隐藏与筛选以精确控制

了解筛选与手动隐藏的区别,才能获得预期结果。若希望 SUBTOTAL() 临时忽略某些数据,请使用筛选;若希望更为持久地排除,请使用手动隐藏(右键 > 隐藏),并选择 101-111 的函数编号以遵循隐藏状态。

这种方法提供分层控制:用筛选获得临时视图,用手动隐藏实现半永久排除,再通过选择合适的函数编号来体现您的隐藏意图。

结语

熟练掌握 SUBTOTAL() 能显著改变您在 Excel 中进行数据分析的方式。相比于在数据变化时容易失效的静态计算,您可以构建能随用户操作和数据修改自动适应的稳健公式。在处理大型数据集或制作会被多人长期筛选与操作的报告时,这项能力尤为重要。

若您希望在 SUBTOTAL() 等单一函数之外,系统提升 Excel 能力,我们提供的 Excel Fundamentals 技能路径为期 16 小时,按部就班地带您从数据准备一路进阶到高级分析与可视化。若您希望立即上手分析应用,我们的 Data Analysis in Excel 课程将教授数据透视表与高级逻辑函数,助您挖掘更深层洞见。

Vinod Chugani

作者

Vinod Chugani

Vinod Chugani 的职业生涯始于东京,曾任摩根大通最年轻的对冲基金销售台负责人,随后在雷曼兄弟创下个人销售纪录,之后又打造了覆盖 30 个国家的电子分销业务,营收突破 1 亿新元,随后转向数据领域。他毕业于杜克大学经济学专业,亦为 NYC Data Science Academy 校友,并在 100 多名申请者中成为Hugo Bowne-Anderson 在 Maven 开设的 “Building AI Applications” 课程的三位奖学金获得者之一。目前,他为 DataCamp、KDnuggets、Machine Learning Mastery 和 Statology 撰稿,内容涵盖从统计学到代理式 AI 等主题,并在 NYC Data Science Academy 指导数据从业者,已完成超过 1,000 场一对一辅导。

 

FAQs

我为什么要在 SUBTOTAL() 中使用 109 而不是 9?

函数编号 9 在计算中包含手动隐藏的行,而 109 会将其排除。若您希望同时忽略被筛选和手动隐藏的行,请选择 109。

Excel 中的 SUBTOTAL() 与 SUM() 有何不同?

SUBTOTAL() 会自动将被筛除的行排除在计算之外,而 SUM() 则不管是否筛选都会包含所有单元格。SUBTOTAL() 还会忽略其他小计公式,防止重复计数。

SUBTOTAL() 能否处理跨多个工作表的数据?

不会。SUBTOTAL() 仅适用于同一工作表内的区域,不支持三维引用。针对多工作表的计算,请使用 SUM() 等替代函数。

我可以将 SUBTOTAL() 用于横向数据区域吗?

可以,但由于 Excel 的筛选与隐藏功能基于行操作,SUBTOTAL() 更适用于纵向数据。用于横向区域时,其可见性逻辑可能与预期不一致。

单个 SUBTOTAL() 公式最多可包含多少个区域?

在一个 SUBTOTAL() 公式中,您最多可以指定 254 个不同的区域。每个区域作为函数编号之后的独立参数添加。

在何种情况下应选择 AGGREGATE() 而非 SUBTOTAL()?

当数据包含需要排除的错误值,或您需要超出 SUBTOTAL() 提供的 11 项基础运算时,请使用 AGGREGATE()。对于数据干净、计算需求标准的场景,SUBTOTAL() 更加简洁。

主题