条件计数函数countif的用法
以前我们说过用sum函数可以实现条件计数,但它不是正统的条件计数函数。countif才是真正的条件计数函数,用于统计满足某个条件的单元格的数量。
-01-
函数说明
先看下它的函数写法,如下图所示,有2个参数。
range:必须 要计算满足条件的单元格区域的引用或者是定义名称的引用,不能是数组。
criterria:必须 以数字,表达式或文本形式定义的条件,也可以是单元格引用。
第2参数支持通配符和数组。第2参数如果是常量数组,形成一个普通数组;如果是多单元格区域的引用,那么形成内存数组,需要ctrl+shift+enter三键结束。
-02-
示例解释
在D1单元格中输入如下公式,结果为2。意思是统计在A1:A4这个区域中等于“苹果”的单元格的数量。
在D1单元格中输入如下公式,结果为2。意思是统计在A1:A4这个区域中等于A1的值“苹果”的单元格的数量,所以还是2。
在D1单元格中输入如下公式,结果为2。意思是统计在B1:B4这个区域中大于55的单元格的数量。
在D1单元格中输入如下公式,结果为4。意思是统计在A1:A4这个区域中包含任意文本的单元格的数量。
-03-
具体应用
1.统计80-90分的人数
下图左表为姓名和对应的分数,求80到90分之间有多少人。这个题有多种方法。第1种如下公式为D6=COUNTIF(B7:B17,">=80")-COUNTIF(B7:B17,">90")。意思是在B7:B17这个区域中大于等于80的个数减去大于90的个数,就是80到90之间的个数。
第2种方法可以用常量数组,公式为D7=SUM(COUNTIF(B7:B17,{">=80",">90"})*{1,-1})。其实这种方法只不过是把上面的2个条件写在一个数组中。这样分别算出它们的个数,但是要相减怎么办?后边就乘以{1,-1},让大于90分的个数变成负数,最后sum求和。
既然用到了数组,那么可不可以把公式改为=SUM(COUNTIF(B7:B17,{80,81,82,83,84,85,86,87,88,89,90}))呢?意思是在B7:B17这个区域中等于80的有几个,等于81的有几个,……等于90的有几个,最后再把它们相加就是80-90之间的个数。当然是可以的。但是我们就不用写这么长的数组了,可以用ROW(80:90)来代替。这样公式为D8=SUM(COUNTIF(B7:B17,ROW(80:90)))。由于ROW(80:90)构成内存数组,要ctrl+shift+enter三键结束。
2.统计不重复的个数
在A列中有一些重复的姓名,现在求不重复的姓名的个数。公式为C18=SUM(1/COUNTIF(A19:A27,A19:A27))。由于第2区域是多单元格区域引用,形成内存数组,所以要三键结束。
意思是在A19:A27这个区域中,等于A19到A27每个单元格值的单元格的个数,还是形成一个数组。如下图红色所示。SUM(1/COUNTIF(A19:A27,A19:A27))后面用1除,再求和是一种数学关系,刚好算出不重复的个数。
用countif还有一种方法,可以计算不重复的个数。公式为B19=COUNTIF(A$19:A19,A19),向下填充。统计结果为1的个数,就是不重复值的个数。为什么统计1的个数就是不重复的个数呢?我们发现当等于1时,代表它是第1次出现。等于2时,代表第2次出现。。。所以只有第1次出现的是不重复的。我们还可以通过对数字排序,将不重复的值,提取出来。
当然,这种方法要建筑辅助列才能实现,如果不用辅助列,一步怎么求出不重复的个数呢?就要用到offset的多维引用。公式为C19=SUM(N(COUNTIF(OFFSET(A19,,,ROW(A19:A27)-18),A19:A27)=1)),三键结束。其实这个公式就是把上面的辅助列想办法写在一个数组中,意思是一样的,只不过形成了多维引用。
好了,关于countif这个条件计数函数就讲这么多,你都学会了吗?