计数三兄弟:COUNT、COUNTA、COUNTIF、COUNTIFS
一、COUNT 只数数值,这是它最大的特点

=COUNT(值1,[值2],...) 看起来是数数,其实它只数数值,也就是数字、日期和能被当成数字解析的文本。区域里的中文、英文单词、逻辑值 TRUE 与 FALSE、错误值、空白单元格,它统统跳过。这一点既是它的价值,也是它最容易让人困惑的地方。
举个具体例子。C2 到 C200 共 199 个单元格,其中 180 个是金额,15 个写着待定,4 个是空的。=COUNT(C2:C200) 返回 180,=COUNTA(C2:C200) 返回 195。两者相差 15,正好对应 15 个文本单元格。这个差值就是排查数据质量的入口:一旦它不为 0,说明这一列里混进了非数值内容。
日期在 Excel 里本质上是数字,所以 COUNT 会把日期算进去。这一点常被误认为是 bug,实际上是特性。反过来,时间也是数字的小数部分,同样会被计入。
需要注意的是,COUNT 对文本型数字的态度和 SUM 完全一致:它会跳过。所以 =COUNT(C2:C200) 返回 180 而实际有 195 行数据时,除了文本,还有可能是文本型数字。这类单元格左上角通常带绿色三角标,选中使用分列功能,一路点下一步即可批量转成真正的数值。
还有一个细节:常量参数也会被计入。=COUNT(1,"你好",TRUE) 返回 1,因为只有 1 是数值;=COUNT(1,"3",TRUE) 返回 2,因为文本 3 会被解析成数字。这种写法在日常工作中很少用,但知道它有助于理解函数的判定逻辑。
知道 COUNT 的这些脾气之后,就能理解为什么很多人第一反应是用它数人数,结果却数少了。正确做法取决于列的内容:如果这一列是工号、金额、日期这类纯数值,用 COUNT 没问题;如果这一列是姓名、部门、状态这类文本,就该用 COUNTA。选错函数是最常见的计数错误,没有之一。
还有一个判断技巧:选中区域后看 Excel 窗口底部的状态栏。状态栏会同时显示平均值、计数和求和,其中的计数等同于 COUNTA,求和只在有数值时才显示。不用写公式就能先扫一眼数据规模,比反复改公式快得多。如果状态栏没有显示这些项目,右键点击状态栏,把对应项勾上即可。
二、COUNTA 与 COUNTBLANK:数非空和数空白
=COUNTA(值1,[值2],...) 数的是所有非空内容,不管里面是数字、文本、逻辑值还是错误值,只要不是空的就算一个。公式产生的空字符串也算非空,这是它最大的坑:单元格里写着 =IF(A2="","",A2),看起来是空的,但 COUNTA 会把它们都数进去,因为空文本不是真空白。
=COUNTBLANK(区域) 正好相反,只数真正空白的单元格。它同样认为空文本不是空白,所以上面那个例子里 COUNTBLANK 返回 0。要判断单元格是否真的什么都没有,用 =ISBLANK(A2) 配合 =LEN(A2)=0 一起检查最稳妥。
| 函数 | 统计对象 | 文本型数字 | 空文本 | 逻辑值 | 错误值 |
|---|---|---|---|---|---|
| COUNT | 仅数值与日期 | 不计入 | 不计入 | 不计入 | 不计入 |
| COUNTA | 所有非空内容 | 计入 | 计入 | 计入 | 计入 |
| COUNTBLANK | 真正空白 | 不计入 | 不计入 | 不计入 | 不计入 |
| COUNTIF | 满足条件的单元格 | 视条件而定 | 视条件而定 | 视条件而定 | 视条件而定 |
三者合起来可以做一张数据体检表:总行数用 COUNTA,数值行数用 COUNT,空白行数用 COUNTBLANK,三者交叉验证,一列数据的健康状况就一目了然。建议把这三个公式放在汇总表的最上方,每次更新数据后扫一眼。
三、COUNTIF:单条件计数与通配符

=COUNTIF(区域,条件) 只有两个参数,比 SUMIF 还简单,因为计数不需要指定求和区域。常见写法有几种:统计某个部门的员工数写成 =COUNTIF(B2:B200,"市场部");统计销售额大于 5000 的订单数写成 =COUNTIF(C2:C200,">5000");统计非空单元格写成 =COUNTIF(B2:B200,"<>")。
条件里引用单元格时同样用连接符拼接。例如 F1 里放着待查的部门名,公式写成 =COUNTIF(B2:B200,F1);要数大于 F1 的行数,写成 =COUNTIF(C2:C200,">"&F1)。把条件放在单元格里而不是写死在公式里,是让模板可复用的关键一步。
通配符规则和 SUMIF 完全一致。问号代表任意单个字符,星号代表任意多个字符。=COUNTIF(A2:A200,"*有限公司") 统计所有以有限公司结尾的客户数量。要匹配星号本身,前面加波浪号转义,写成 ~*。
COUNTIF 有个容易踩的坑:它把文本型数字和真数字当成两类。假设 A 列里混着数字 12345 和文本 12345,=COUNTIF(A2:A100,12345) 只会数到真数字那一批。更麻烦的是,当条件是超过 15 位的长数字时,比如身份证号或订单编号,COUNTIF 会因为浮点精度问题把不同的号码判成相同。遇到长编号,务必在条件后面连一个星号写成文本匹配,或者改用 SUMPRODUCT。
COUNTIF 还能用来做数据校验。比如在旁边加一列写 =IF(COUNTIF(A:A,A2)>1,"重复",""),逐行标记重复项,比用条件格式更灵活,因为结果可以再参与别的计算。类似的思路还能做白名单校验:=IF(COUNTIF(参数表!$A$2:$A$20,B2)=0,"不在名单内",""),把录入错误挡在源头。
条件参数是文本这一事实还带来一个便利:条件可以来自公式拼接。例如要统计某个动态阈值以上的行数,写 =COUNTIF(C2:C200,">"&AVERAGE(C2:C200)),阈值随数据自动变化,不用手工改。这类组合在制作自动更新的看板时非常实用。
四、COUNTIFS:多条件计数与区域一致性
=COUNTIFS(条件区域1,条件1,[条件区域2,条件2],...) 是 COUNTIF 的多条件版本,最多支持 127 组条件,所有条件之间是与的关系。注意它的参数顺序与 SUMIFS 不同:COUNTIFS 没有求和区域,所以第一个参数就是条件区域,这一点反而比 COUNTIF 更好记,因为两者结构一致。
实例:统计市场部中销售额大于 5000 的订单数,写成 =COUNTIFS(B2:B200,"市场部",C2:C200,">5000")。统计某个月份内状态为已付款的订单数,写成 =COUNTIFS(A2:A200,">="&DATE(2026,1,1),A2:A200,"<"&DATE(2026,2,1),E2:E200,"已付款")。
所有条件区域的形状必须一致,都是 199 行、单列。如果一组是 B2:B200,另一组写成 C2:C300,Excel 会报错或者给出错误结果,取决于版本。养成习惯:写完第一个区域,后面几个直接用填充柄拖,而不是手打。
或关系的处理与 SUMIFS 相同。要数市场部和销售部的总人数,写成 =COUNTIF(B2:B200,"市场部")+COUNTIF(B2:B200,"销售部"),或者用数组常量 =SUM(COUNTIF(B2:B200,{"市场部","销售部"}))。第二种写法在 Excel 365 与 WPS 新版里都能正常工作,老版本可能需要按 Ctrl 加 Shift 加 Enter 确认。
五、去重计数与几个真实场景
去重计数之所以没有专门函数,是因为历史原因。Excel 直到 365 版本才引入 UNIQUE,此前用户只能靠 SUMPRODUCT 与 COUNTIF 的组合曲线救国。也正因为如此,你在网上搜到的去重公式大多长得差不多,都是 =SUMPRODUCT(1/COUNTIF(...)) 这个样子。理解它的原理比背下公式更重要,因为一旦数据里出现空值或错误值,背下来的公式会直接崩掉,而懂原理的人知道该怎么改。
去重计数是职场高频需求,但 COUNTIF 家族没有直接提供。经典解法是用 SUMPRODUCT 配合 COUNTIF:=SUMPRODUCT(1/COUNTIF(B2:B200,B2:B200))。原理是每个值出现的次数取倒数,同一值出现 N 次就贡献 N 个 1 除以 N,加起来正好等于 1,从而得到不重复值的个数。
这个公式有两个前提。第一,区域里不能有空白单元格,否则 COUNTIF 返回 0,1 除以 0 会得到除零错误。解决办法是把区域缩小到实际数据范围,或者在公式外层套 IFERROR。第二,区域不能包含错误值。满足这两点后,它是兼容性最好的去重计数写法。
还有一个真实场景值得单独说:跨表计数。数据源在明细表里,汇总表在另一张工作表,公式写成 =COUNTIFS(明细!B:B,F2,明细!C:C,"出勤") 即可。跨表引用时,先把两张表都打开,用鼠标点选区域,让 Excel 自动补全工作表名和感叹号,比手打更不容易出错。工作表名带空格时,Excel 会自动加单引号包裹。
场景一:考勤统计。A 列日期,B 列员工姓名,C 列出勤状态。要算某位员工某月的出勤天数,写成 =COUNTIFS(B:B,F2,C:C,"出勤",A:A,">="&G2,A:A,"<"&EDATE(G2,1))。把员工名放在 F2、月初日期放在 G2,向下填充就能出一整张考勤汇总。
场景二:重复值检查。要判断某个编号在数据里是否重复出现,写 =COUNTIF(A:A,A2),结果大于 1 就说明重复。配合条件格式,把大于 1 的整行标红,一张表里的重复数据立刻现形。这是去重前的标准动作。
场景三:完成率统计。任务表里 E 列是状态,取值包括已完成、进行中、未开始。完成率写成 =COUNTIF(E2:E200,"已完成")/COUNTA(E2:E200),分母用 COUNTA 而不是 COUNT,因为状态列全是文本,用 COUNT 会得到 0。这类分母选错的失误非常常见,值得单独记一笔。
场景四的前置说明:凡是涉及状态、部门、类别这类文本字段的计数,分母一律用 COUNTA,绝不能用 COUNT。因为 COUNT 只认数值,在文本列上永远返回 0,除法结果会变成除零错误。这一条在算完成率、合格率、占比时反复用到,值得记牢。
场景四:分段计数。要统计成绩在 60 以下、60 到 80、80 以上的人数,建一张区间表后用 =COUNTIFS(C:C,">="&F2,C:C,"<"&G2) 向下填充。区间边界放在单元格里,改分数段不用改公式。
六、计数结果的校验与呈现
计数最容易出错的地方不是函数,而是口径。统计订单数时,一张订单拆成多行明细,直接数行数就会虚高;统计人数时,同一人在表里出现多次,直接计数也会重复。写公式前先问自己一句:我要数的是行数,还是不重复的实体个数。前者用 COUNTIFS,后者必须去重。
去重计数的现代写法是把区域先取唯一值,再数唯一值的个数。Excel 365 里可以写 =COUNTA(UNIQUE(B2:B200)),WPS 新版同样支持 UNIQUE。如果要配合条件,先用 FILTER 过滤再套 UNIQUE,写成 =COUNTA(UNIQUE(FILTER(B2:B200,C2:C200>5000)))。这套组合写法在老版本里不可用,需要向下兼容时退回 SUMPRODUCT 方案。
| 需求 | 兼容写法 | 新版写法 | 备注 |
|---|---|---|---|
| 数非空单元格 | =COUNTA(B2:B200) |
同左 | 全版本通用 |
| 数数值单元格 | =COUNT(C2:C200) |
同左 | 不含文本型数字 |
| 单条件计数 | =COUNTIF(B2:B200,"市场部") |
同左 | 条件可用通配符 |
| 多条件计数 | =COUNTIFS(B2:B200,"市场部",C2:C200,">5000") |
同左 | 全部为与关系 |
| 不重复个数 | =SUMPRODUCT(1/COUNTIF(B2:B200,B2:B200)) |
=COUNTA(UNIQUE(B2:B200)) |
区域内不能有空值 |
| 空白单元格数 | =COUNTBLANK(B2:B200) |
同左 | 空文本不算空白 |
结果呈现上有个小建议:把计数结果和它的分母放在一起。只写一个人数 38,看报表的人不知道总数是 40 还是 200;写成 =COUNTIF(...) 除以 =COUNTA(...) 的百分比,信息量立刻翻倍。字段命名也别偷懒,写清是行数还是人数,半年后你自己也认得出来。
常见问题
COUNTIF 统计身份证号总是不准怎么办
这是浮点精度导致的。COUNTIF 在比较时会把数字转成浮点数,超过 15 位的号码后面的位数会被抹平,导致不同号码被判为相同。解决办法是把条件写成文本匹配,例如 =COUNTIF(A:A,A2&"*"),强制按文本处理;或者改用 =SUMPRODUCT(--(A2:A200=A2)),后者同样按文本比较。最根本的做法是在录入前把该列设为文本格式。
为什么 COUNTA 数出来的行数比实际看到的多
公式返回的空字符串被算成了非空。比如单元格里是 =IF(A2="","",A2),显示上什么都没有,但 COUNTA 认为它有内容。改成 =IF(A2="",NA(),A2) 或者干脆在源数据里不做这种处理,就能避免。临时核对时,用 =COUNTIF(A2:A200,"?*") 只数真正有字符的单元格,比 COUNTA 更贴近直觉。
COUNTIFS 的日期区间为什么总是少算一天
因为日期里藏着时间。如果 A 列是包含时间的完整时间戳,写成 "<="&DATE(2026,1,31) 会把 1 月 31 日下午的数据全部漏掉,因为那一天的 15:00 大于当天的 0:00。正确写法是用小于次月月首:=COUNTIFS(A:A,">="&DATE(2026,1,1),A:A,"<"&DATE(2026,2,1))。这一条适用于所有带日期区间的统计,务必养成用开区间收尾的习惯。
条件里用了通配符,为什么结果反而变少
通配符只对文本有效,对数字无效。=COUNTIF(C2:C200,"5*") 不会数出所有以 5 开头的金额,因为金额是数值,通配符匹配不到任何东西,返回 0。要对数值做按位判断,得先把它转成文本,例如 =COUNTIF(C2:C200,">=50")-COUNTIF(C2:C200,">=60") 才能数出 50 到 59 这一段。这一条也解释了为什么很多看似合理的通配符公式会静默返回 0。
条件区域大小不一致会怎样
新版本的 Excel 会直接返回 #VALUE!,老版本则可能默默给出错误结果。无论如何都不要依赖它的容错。写完公式后,用鼠标点一下每个参数,确认高亮的选框范围完全一致,这是最快的检查方法。
多条件里需要或关系,只能写很多个 COUNTIF 相加吗
如果或的分支不多,相加是最清晰的写法,可读性最好。分支多的时候,可以加一列辅助列做归类,例如写 =IF(OR(B2="市场部",B2="销售部",B2="渠道部"),"一线","后台"),然后对辅助列做一次 COUNTIF。逻辑判断的写法可以参考 AND、OR、NOT 与布尔运算。
想统计同时满足三个以上条件,公式会不会很慢
不会。COUNTIFS 内部做了优化,即便十万行数据配四五个条件,几十个公式也能秒算。真正拖慢表格的是整列引用加大范围数组公式的组合,以及大量 volatile 函数。如果确实感觉卡顿,优先把整列引用改成精确区域,其次减少条件格式的规则数量,而不是去怀疑 COUNTIFS 本身。
COUNTIF 与 SUMIF 的条件写法能通用吗
绝大多数情况下完全通用,比较运算符、通配符、单元格拼接的规则都一样,学到的技巧可以两边复用。两者唯一的差别是 SUMIF 多一个求和区域参数,并且位置在最后。如果你已经熟悉 SUM 家族:SUM、SUMIF、SUMIFS,那么 COUNTIF 几乎没有新东西要记。
计数结果要不要包含小计行和标题行
不要。标题行会被 COUNTA 数进去,小计行会被 COUNT 数进去,两者都会让结果偏大。规范做法是把标题行放在数据区之外,比如冻结在第 1 行而数据从第 2 行开始;小计行则放在数据区下方,并且留出至少一个空行作为分隔。如果实在无法避免,就在公式里把区域写成 B2:B200 而不是 B:B,用精确范围绕开它们。
数据每天新增,如何让计数公式自动跟上
推荐把数据区转成智能表。选中数据区按 Ctrl 加 T,勾选包含标题,之后在汇总公式里引用表格的列,例如 =COUNTIF(表1[部门],"市场部")。新增行会自动被纳入统计,公式一个字都不用改。退一步的做法是用动态命名区域,或者干脆把区域多留几百行余量,例如数据只有 200 行却写成 B2:B2000,空行不会影响计数结果。
WPS 里计数函数有差异吗
COUNT、COUNTA、COUNTIF、COUNTIFS 在 WPS 表格里全部支持,语法一致。COUNTBLANK 也支持。需要注意的是,WPS 早期版本对 SUMPRODUCT 配合 COUNTIF 的去重写法支持不稳定,出现结果异常时改用辅助列加 COUNTIF 再加 SUM 的笨办法,兼容性最好。
