LOOKUP也能精确查找?这个0除套路,我琢磨了好久才想明白



Lv.3 优质创作者
LOOKUP也能精确查找?这个0除套路,我琢磨了好久才想明白
大家好,我是墨云轩。
最近有位网友问了这样一道问题:LOOKUP函数能不能实现精确查找?
说实话,这个问题我以前也没怎么细想过。因为大家都知道,LOOKUP默认是模糊查找,它也没有VLOOKUP那样的第四参数,想指定「精确匹配」都没地方点。但琢磨下来,其实有一个很经典的套路,今天分享给大家,边学习,边分享。
一、先看问题:直接用LOOKUP,结果错了
数据很简单:A列是员工号(A101到A109),B列是员工姓名。现在想通过E2单元格的姓名,查出对应的员工号。
按照惯性思维,公式应该这么写:
=LOOKUP(E2,B:B,A:A)
第一参数查找E2,第二参数是姓名所在的B列,第三参数是返回结果所在的A列。思路和VLOOKUP差不多,对吧?
但按下回车,悲剧了。
无论E2里换成哪个姓名,返回的都是A109。比如我查「simple」,明明它在B6,对应的应该是A105,结果却返回了A109,完全是一个错误的答案。
原因就是前面说的:LOOKUP默认是模糊匹配,又没有第四参数可以指定精确匹配。所以这节课的议题就来了——怎么让LOOKUP实现精确查找。
二、铺垫一个理论:TRUE等于1,FALSE等于0
在讲套路之前,先说一个Excel里的基础理论:逻辑值FALSE代表0,TRUE代表1。
怎么验证?在G2输入:
=B2=$E$2
注意这里E2要加绝对引用锁定,因为向下拖拽时B2要变成B3、B4,而E2始终是E2。
拖拽之后,相等的行返回TRUE,其他行返回FALSE。
再在旁边输入 =G2+0,你会发现:TRUE加0等于1,FALSE加0等于0。这就是逻辑值参与运算的规则。
三、关键一步:用0除,把没用的行全变成错误值
有了这个理论,思路就出来了。
LOOKUP是模糊查找,如果我能把其他结果都变成错误值,只留下一个0,那让它去找一个比0大的数,是不是就只会命中我想找的那一行了?
具体做法:输入
=0/G2
FALSE代表0,0÷0就是除零错误。拖拽之后你会发现,整列只有匹配的那一行返回0,其他全是#DIV/0!错误值。
这时候再用LOOKUP查找1(任何比0大的数都行):
=LOOKUP(1,0/(B2:B10=E2),A2:A10)
公式拆开看:
B2:B10=E2:姓名区域和E2逐个比较,返回一组TRUE/FALSE;0/(...):TRUE变成0,FALSE变成#DIV/0!错误;LOOKUP(1,...):在只有0和错误值的数组里找1,二分法总会定位到那个0;第三参数A2:A10:返回0所在位置对应的员工号。
四、不懂数组?教你用F9看公式真相
可能有朋友要问了:B2:B10=E2这种写法,一个单元格里怎么装得下一组比较结果?
其实它确实产生了一个数组,只是单个单元格显示不出来。教大家一个小方法:选中公式栏里这部分,按一下F9,就能看到全部内容了。
比如E2是「闲池」,按F9可以看到:
{FALSE;FALSE;FALSE;TRUE;FALSE;FALSE;FALSE;FALSE;FALSE}
再做0除运算,按F9:
{#DIV/0!;#DIV/0!;#DIV/0!;0;#DIV/0!;#DIV/0!;#DIV/0!;#DIV/0!;#DIV/0!}
0正好在第4位。最后LOOKUP返回A2:A10里第4个值,也就是A104。查「闲池」,返回A104,完全正确。
看完F9的拆解,这个公式就一目了然了。
五、方法小结
写法 | 结果 | 说明 |
=LOOKUP(E2,B:B,A:A) | 错误 | 默认模糊匹配,结果不可控 |
=LOOKUP(1,0/(B2:B10=E2),A2:A10) | 正确 | 经典0除套路,实现精确查找 |
几点说明:
1. 第一参数写1就行,本质是「找一个比0大的数」,写2、写100也可以;
2. 这个原理基于LOOKUP的二分法查找,错误值会被跳过,只命中那个0;
3. 0/(B2:B10=E2)这个区域写法,新旧版本的WPS表格都能用,不用担心版本问题。
如果你有更好的方法,或者发现我哪里讲得不对,欢迎留言交流!
我是墨云轩,热衷分享办公小技巧,边学习,边分享,每天进步一点点!感谢您的阅读!
Lv.3 优质创作者
Lv.3 优质创作者