要只统计筛选后的可见单元格,直接用 subtotal 函数就能实现。想数筛选结果里的非空项,最常用的公式是 =subtotal(103,统计区域)。当前操作软件:microsoft excel;软件版本:microsoft 365。配图使用真实表格软件操作帧辅助说明,和 excel 的筛选逻辑、公式参数一致;不同软件版本的菜单位置可能略有出入。
举个例子,要统计 B2:B7 范围内筛选后仍显示的非空数据,公式直接写成 =SUBTOTAL(103,B2:B7) 就好。这里的 103 对应 COUNTA 的统计规则,不光筛选自动隐藏的行不算,手动右键隐藏的行也不会被计入结果。
第一步
先确认好要统计的列,还有最后放汇总结果的空白单元格。示例表里 A 列是姓名,B 列是待统计数据,汇总结果我们放在 B8,之后不管你筛选姓名还是数据列,B8 的数值都会跟着当前显示的行自动更新。

第二步
点进刚才选好的汇总单元格,输入 =SUBTOTAL(103,B2:B7)。如果你的数据区域是 C2:C100,直接把第二个参数改成 C2:C100 就行;注意别把顶部的标题行一起选进统计区域,不然标题文字也会被当成一个非空项,最后结果会多算1个。

第三步
点开标题行的筛选小按钮,只勾选你需要保留的项目,点确认生效。筛选完成后,所有被隐藏的行都不会参与 SUBTOTAL(103,...) 的统计;就算是没被隐藏的行里存在空白单元格,它也不会被计入最终结果。

第四步
切回汇总单元格核对结果就行。示例里筛选后可见的非空数据一共4个,汇总值就会显示4;之后你更换筛选条件,这个数字会自动跟着更新,不用手动调整公式。

函数语法和参数
SUBTOTAL 的基本语法是 =SUBTOTAL(function_num, ref1, [ref2], ...)。它特别适合放在筛选表格的上方或者下方,用来做会随筛选结果自动变化的汇总统计。
本文档主要介绍如何通过python对office excel进行读写操作,使用了xlrd、xlwt和xlutils模块。另外还演示了如何通过Tcl tcom包对excel操作。感兴趣的朋友可以过来看看
| 参数 | 写法示例 | 作用 |
|---|---|---|
function_num |
103 |
指定统计方式。103 对应 COUNTA,统计可见区域里的非空单元格,并忽略筛选隐藏行和手动隐藏行。 |
ref1 |
B2:B7 |
第一个统计区域。这里应只选数据区域,不要包含字段标题。 |
[ref2] |
D2:D7 |
可选的第二个统计区域。多个区域会合并统计,区域之间用英文逗号分隔。 |
要是你只想忽略筛选自动隐藏的行,手动隐藏的行还要计入统计,可以把第一个参数改成 3;希望手动隐藏行也不计入的话,就用 103。日常做非空计数一般用103,只数数字个数用102,求和的话才用109。
常见错误
最容易踩的坑有三类:第一类是把参数错写成 102。102 对应 COUNT 函数,只会统计数字;如果单元格里是“已完成”“未处理”这类文本,结果就会少算。第二类是统计区域包含了标题行,标题本身是非空文本,最后结果会凭空多1。第三类是把公式放在筛选覆盖的区域内部,筛选时公式所在行可能一起被隐藏,建议把汇总单元格放在表格上方、下方或者旁边的空白列。
另外还要留意假空白的情况:有些公式返回 "" 时,界面上看着完全空白,但 COUNTA 仍会把它当成非空;如果表格里这类情况很多,建议先把辅助列的结果改成真正的空白,或者换用带条件判断的公式处理。
扩展示例
要统计筛选后 C 列“回访状态”的非空数量,可以直接写 =SUBTOTAL(103,C2:C100)。要是还想统计筛选后 D 列备注里有内容的条目数,公式就是 =SUBTOTAL(103,D2:D100)。多区域一起统计时可写 =SUBTOTAL(103,C2:C100,D2:D100),但要确认两个区域的统计维度确实可以相加,不然结果没有实际意义。
要是你这个表格经常需要新增行,可以先把数据区域转换成 Excel 内置表格,再用结构化引用写公式,例如 =SUBTOTAL(103,表1[回访状态])。如果你用的是 WPS 或者旧版 Excel,最好先确认下软件是否支持对应的表格引用写法;拿不准的时候,直接用普通区域引用最稳妥。










