摘要:看似完美,但应用到“供应商3”时明显有误。此处正确结果应该是0,而不是1.
需求:统计供应商的合格零件数量。
常规解决方案
这样的场景很常见,筛选-去重-计数三步搞定。
FILTER筛选出指定供应商的合格零件:
=FILTER(B:B,(C:C="合格")*(A:A=E2))筛选结果有重复值,UNIQUE去重:
=UNIQUE(FILTER(B:B,(C:C="合格")*(A:A=E2)))最后对数组中的非空单元格计数:
=COUNTA(UNIQUE(FILTER(B:B,(C:C="合格")*(A:A=E2))))漏洞
看似完美,但应用到“供应商3”时明显有误。此处正确结果应该是0,而不是1.
FILTER+UNIQUE+COUNTA这一组合已经流传甚广,只有少数网友发现了这一漏洞,毕竟它只在特定情况下才会现出原形。
原因
其实原因很简单,回到第一步筛选:
=FILTER(B:B,(C:C="合格")*(A:A=E4))由于没有符合筛选条件的结果,FILTER返回错误值。
下一步UNIQUE去重结果也是错误值。
再下一步COUNTA统计非空单元格结果为1,因为放了错误值的单元格也是非空单元格。
所以在没有满足筛选条件的情况下始终返回错误结果1.
改进方案
有两个改进方案,都是从最后一步计数入手。
方案1,ROWS+IFFERROR取代COUNTA
ROWS用于统计UNIQUE返回数组的行数,UNIQUE返回错误值时ROWS也返回错误值,IFERROR将错误值转换为0:
=IFERROR(ROWS(UNIQUE(FILTER(B:B,(C:C="合格")*(A:A=E4)))),0)方案2,LEN+COUNT代替COUNTA
LEN用于统计UNIQUE返回数组各元素的长度,得到一个数字数组,COUNT统计数字的个数即可。当UNIQUE返回错误值时LEN也返回错误值,COUNT统计错误值得0:
=COUNT(LEN(UNIQUE(FILTER(B:B,(C:C="合格")*(A:A=E4)))))漏洞的根本原因是没有符合条件的数据时FILTER返回错误值,把FILTER第三参数用起来,没有符合条件的数据时让它返回空,能不能解决?为什么?
来源:Excel笔记本一点号