COUNTIF函数有个BUG,你知道吗?
小A踩坑系列1:VLOOKUP函数有个BUG,你——知道吗?
……
小A离职后“赋闲”在简陋的租室里。
冬天深了,天气越来越冷,患有懒癌晚期的小A不想出门。她想年后再去找工作,这段时间,就一个人呆着,充下电,学下OFFICE办公软件、职场交际法则、以及如何谈一个高富帅的男票……
小A的塑料花姐妹小C碰到一个Excel问题,她知道小A有在网上学过一段时间表格技巧,Excel玩的不错,据说——因此就来问小A……
小C的问题很简单。
小A给秒杀了。
小C的惊呼、赞叹和吹捧满足了小A的虚荣心,小A很谦虚的表示,一般操作,都是一般操作……
没想到,第2天,小A就被小C给骂了……
原来是小A把那题给解错了,害的小C被主管狠批了半个小时。
就是这题儿,需要查询C列的身份证号在A列是否存在,小A给出的函数公式是:
=IF(COUNTIF(A:A,C2),'存在','不存在')
COUNTIF函数计算C2的值在A列出现的次数,如果次数大于0,则条件为真,IF函数返回“存在”,否则返回“不存在”。
这题如此简单……怎么可能算错?!
……除非……COUNTIF跟VLOOKUP学坏了,也出BUG了~!
小A很懵。
然而不管怎么样!结果确确实实算错了,很多C列的身份证号,A列并不存在,都算成了存在……
BUG!!又见BUG!!!
可惜小A不认识八阿哥的皇阿玛,所以灭不了BUG~
缓过劲来的小A愤愤的问了几个在网上结识的表格高手,终于明白这bug是怎么回事了。
原来COUNTIF在计算的过程中,会自动将文本数值,转换为数值。而众所周知的是,当数值超过15位,如果不作文本保存,就会丧失准确度;超过15位的部分,统统会变成了0。
例如370409198907045562,会变成370409198907045000。
如此一来,COUNTIF的计算结果就难免出错了。
这就是坊间著名的身份证问题。
怎么解决呢?
高手也给出了解决公式:
=COUNTIF(A:A,C2&'*')
C2&'*',星号是通配符,代表0到多个字符,和数值搭配后,会将数值强迫转换为文本值,这样就可以强制COUNTIF按文本类型对数值进行匹配计数了,也就避免了【BUG】的产生。
小A松了口气,原来是这么回事,8错8错,又学了一招。
小A把高手的解决方案给了小C。
会不会又错?小C不放心。
绝对不会错!小A保证。
如果错了呢?
不可能!
如果……
不可能!
……
第2天
小A就被小C给骂了……
原来是小A把那题又给解错了,害的小C被主管狠批了1个半小时。
……
……
小C说,小A你就是个傻子,C3单元格的身份证号只有17位,A列所有的身份证号都是18位,你告诉我,为什么你认为它存在?
小A说不出来。
她无言以对……
原来高手也……
小C发了一大段信息给小A,意思无非是她早就知道Excel不是个好东西,天底下哪里有这么好的事,几秒钟就可以做完她要做一天的事,什么Excel函数?完全不靠谱!还是一条一条查找有用……
小A气得抬手就给了小C一……个赞!!
——小C说的太对了!函数就是个坑货啊!!如果不会函数,哪有这么多破事?人生识字忧患始…………
……
……
我忘记告诉你那个公式……要求数值的长度得一致,比如都得18位。高手对小A解释。
……小A不知道说什么好。
高手问小A,这个问题,你为什么不用VLOOKUP呢?我记得你的VLOOKUP学的很好啊!
……小A更加不知道说什么好了。
我和VLOOKUP有仇,大仇!小A这么回高手。
高手不想揭小A的伤疤,他回了个“哦“字,然后说,那你也可以用MATCH函数啊,比如:=IF(COUNT(MATCH(A:A,C2,0)),'存在','不存在')
那我要是想计数呢?小A问,我要是想计算C列的数据在A列出现的次数,COUNTIF就没办法用了吗?
高手说,计数就用SUMPRODUCT吧,用等号去判断两个值是否相等。=SUMPRODUCT((A$2:A$22=C2)*1)。等号就像天枰,很公平,等号两边的数值类型和值都一样才相等,它不会犯COUNTIF的错。
小A致谢,想了想,又问:你刚刚说MATCH函数,它有没有BUG啊?
BUG?没有啊!高手很困惑小A的提问。
真的没有?
没有!
真的?
真的!!
小A信以为真,她决定以后再碰到数据查询问题就用MATCH函数去处理~VLOOKUP?她不敢用了。
于是……
没多久,她就被MATCH函数给坑了。
……
……
MATCH的坑……
……下期再聊吧~