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

墨云轩
墨云轩 WPS资深用户Lv.3 优质创作者KVPWPS寻令官

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表格都能用,不用担心版本问题。

这个0除套路在函数圈流传很广,说实话我第一次见到时也是一头雾水,自己按F9一步步拆完才想明白。分享出来,希望也能帮到有同样困惑的朋友。

如果你有更好的方法,或者发现我哪里讲得不对,欢迎留言交流!

我是墨云轩,热衷分享办公小技巧,边学习,边分享,每天进步一点点!感谢您的阅读!

河北省
浏览 179
收藏
10
分享
10 +1
3
+1
全部评论 3
 
HC.旋
HC.旋 WPS资深用户Lv.3 优质创作者WPS寻令官KVP

Lv.3 优质创作者

学到了,突然想起了,很久很久以前,初学去重求个数=sum(1/countif()),也是用到了0/或者1/的斜修方法
   福建省
举报
1
2
墨云轩
墨云轩WPS资深用户Lv.3 优质创作者KVPWPS寻令官

Lv.3 优质创作者

现在有了动态数组方便多了
· 河北省
举报
0
0