Google 表格公式 - 比较空
本文介绍比较空值和查找非空值
为什么会专门拿出这个东西来说呢?难道不是有一堆比较空值的函数吗?当然,既然拿出来,就说明预设的函数有些不合期望的行为。不管是 COUNTA
还是 COUNTIF
还是 ISBLANK
,它们共同的问题就是并不把形如 =""
的结果视为空。
比如我们用 FILTER
或者 QUERY
筛选出了一些值,我们想计算这些值的个数,一般情况下是没问题的,但是如果没有筛选出任何值,通常函数会返回一个 #N/A
,这个值会被计数为 1。
为了避免这个情况,“聪明”的我们将筛选公式用 =IFNA(..., "")
包了起来,满以为这个“空值”就不会被计数了吧,但结果并没有什么区别,还是为 1。因为 经过公式计算出的 ""
值,并不是空值。
后注:当然,这里如果使用
=IFNA(...)
,即省略第二个参数,那结果就是真正的空值了。不过为了继续后面的讨论,我们先假设不知道这一点。
我们拿这个样表做个实验,其中 A5
处有公式 =""
,而 A3
和 A6
处是真的什么也没有。
A | B | C | |
---|---|---|---|
1 | a | ||
2 | 1 | ||
3 | |||
4 | 0 | ||
5 | |||
6 | |||
7 | e |
我们如何计算 A 列有多少个非空值?
我们期望的非空值是 4 个,那么怎么通过公式获得呢?COUNT
肯定就可以排除了,只能计算数值而不能计算字符串,所以我们用 COUNTA
试试。
B1
填入公式 =COUNTA(A1:A)
A | B | C | |
---|---|---|---|
1 | a | 5 | |
2 | 1 | ||
3 | |||
4 | 0 | ||
5 | |||
6 | |||
7 | e |
结果不太如意啊,为什么是 5 不是 4 呢?因为 A5
处有公式,虽然看上去是空的,但并非空值。
呵呵。
那有没有其他办法呢?
我们来试试 COUNTIF
的各种跟空值有关的比较。
C1
填入 =COUNTIF(A1:A, "=")
,D1
填入 =COUNTIF(A1:A, "<>")
,E1
填入 =COUNTIF(A1:A, "")
A | B | C | D | E | |
---|---|---|---|---|---|
1 | a | 5 | 2 | 5 | 3 |
2 | 1 | ||||
3 | |||||
4 | 0 | ||||
5 | |||||
6 | |||||
7 | e |
其实前两个结果也是一样的,都把 A5
当成非空值计算了,但是 E1
的公式可以同时获取到真的为空和看上去为空的值,它的结果为 3,也就是说它把 A3
、A5
、A6
都看为空了。这是最接近结果的一个公式,为了取得我们期望的非空值,我们可以把总范围长度减去这个值。
F1
填入公式 =ROWS(A1:A)-COUNTIF(A1:A, "")
A | B | C | D | E | F | |
---|---|---|---|---|---|---|
1 | a | 5 | 2 | 5 | 3 | 4 |
2 | 1 | |||||
3 | ||||||
4 | 0 | |||||
5 | ||||||
6 | ||||||
7 | e |
不容易,我们终于得到 4 了。当然,因为 A1:A
这个范围用到了两次,为了避免重复,可以用 LET
重构一下,将公式改为 =LET(r, A1:A, ROWS(r)-COUNTIF(r, ""))
,结果不变。
其实还有另一个办法,在 H1
填入公式 =COUNTIF(MAP(A1:A, LAMBDA(x, x="")), FALSE)
同样可以得到 4。
因为这里 x=""
进行比较时,不管是真的空值,还是公式计算出来的 ""
值,都会得到 TRUE
,所以我们计算 FALSE
的个数,得到的就是我们期望的非空值的个数。
但是如果把这里的 x=""
替换为 ISBLANK(x)
就不行了,因为后者会把 ""
视为非空值。
I1
填入公式 =COUNTIF(MAP(A1:A, LAMBDA(x, ISBLANK(x))), FALSE)
结果是 5。
A | B | C | D | E | F | G | H | I | |
---|---|---|---|---|---|---|---|---|---|
1 | a | 5 | 2 | 5 | 3 | 4 | 4 | 5 | |
2 | 1 | ||||||||
3 | |||||||||
4 | 0 | ||||||||
5 | |||||||||
6 | |||||||||
7 | e |
总结来说,计算我们直观上的非空值可以用如下三个公式:
=LET(r, A1:A, ROWS(r)-COUNTIF(r, ""))
=COUNTIF(MAP(A1:A, LAMBDA(x, x="")), FALSE)
=COUNTIF(ARRAYFORMULA(A1:A=""), FALSE)
第三个公式原理上跟第二个一样。(相比来说竟然还是第一个公式最短……)