LOOKUP函数在我之前的文章函数分类中,处于的位置为:表内函数--基础函数--指向性函数。官方释义是这样的:查询一行或一列并查找另一行或列中的相同位置的值。粗看这一解释,感觉和VLOOKUP的功能一样,但实际上呢,简直可以说是天差地别。

LOOKUP函数是一个进阶函数,这里面有两层意思:1、该函数很强大,使用方式很灵活,要掌握它不容易;2、该函数理解起来有一定的难度,掌握它之后,对函数的认知会提升一个层次。如果你还没有彻底弄懂它的话,那么仔细看这篇文章,带你一次就碾碎它的神秘。

基本用法:(几乎没什么参考价值,纯粹摆设)

LOOKUP 有两种使用方式:向量形式和数组形式

向量形式:LOOKUP(lookup_value, lookup_vector, [result_vector])

数组形式:LOOKUP(lookup_value, array)

接下来进入正题,我们通过三个应用实例,来看看怎么才能揭开它的面纱。

1、查找最后一个值

我们都知道用VLOOKUP可以返回符合条件的第一个值,但是如果我们要返回的是最后一个满足条件的值怎么办呢?可以使用LOOKUP。下图需要返回业务员的最后一次销售数量:=LOOKUP(J7,A1:F23)

如果要使用其他方法得到这个最后一次出现的满足条件的值并不容易,而这个函数可以轻易实现,但是有个前提,业务员所在列需要升序排列,这点很重要,切记,不然就得不到最后的结果。这到底是怎么回事呢?这就是征服它的关键所在,三个字:二分法,具体的最后总结。

2、多条件反向查询

反向查询在实际工作中经常会用到,但是大家基本使用的都是VLOOKUP或者是INDEX+MATCH组合来实现,公式稍显复杂,如果是LOOKUP来实现的话,会简化一些。看下图的例子:精准定位到杭州的洗衣机业务员。注意这里我的条件列并没有按升序排列,却依然能得到正确的结果。

=LOOKUP(1,0/((D2:D23=J7)*(C2:C23=K7)),A2:A23)

这个多条件反向查询的公式已经算是最简洁的了,其他的公式实现起来只会更复杂一些。而且这个查找不需要对数据的排列有额外的要求,也能精确返回结果,实用性很强,其中的原理究竟是什么呢?还是那三个字:二分法

3、提取连续数字的数值

之前也介绍过用VLOOKUP取连续数字的数值,但是那个公式太复杂了,在实际工作中,应用起来很不方便,有了LOOKUP就不一样了,简短的一个小嵌套就可以完美解决。图中例子的语法:=LOOKUP(9^9,RIGHT(G2,ROW($1:$9))*1),其中的奥秘在哪里呢?答案还是那三个字:二分法。

介绍完应用的例子,接下来是最重要的思路总结和原理剖析。这个函数一直都是广大学习者的一个理解难点,很多学习者不能理解它,所以就会觉得它捉摸不透,无法主动应用,只能被动地接受别人介绍的具体用法。所以网上经常会有这样的文章:某某函数的经典几种用法,但这样的用法你学到老也学不完。

其实LOOKUP不论多少种用法,万变不离其宗,都是利用了它的取数原理:二分法。哪怕是官方给出的两种形式:向量和数组,其实都是二分法原理在作怪,仅此而已。接下来就看看这个神秘的二分法吧。

Lookup函数二分法的原理

二分法查找是把查找范围中的数据按照个数一分为二找到位于中间位置的一个数据,暂且叫它中间值A,然后用我们的目标值和中间值A做比较。①当目标值等于中间值A时,直接取得对应的结果;②当目标值大于中间值A时,则向下继续用二分法的原理查找比较(也就是在不含中间值A在内的下方的那一半数据中继续进行二分法查找,得到新的中间值B,如此反复);③当目标值小于中间A时,则向上继续用二分法原理查找比较。(口诀:大下小上

如果二分到最后一个数据都未找到等于目标值的数据:目标值大于最后一个数据的,那就返回最后一个数据所在位置的对应值;目标值小于最后一个数据的,那就再向上找一个位置最靠近最后一个数据的小于或等于目标值的数据,再以这个数据的位置去获取结果。

这样一说,可能你更晕了,没关系,举个例子就明白了:

图中有9个数,对应着9个人的名字,现在想要查找2对应的人是谁。注意这个例子是个特例,先用特例便于大家理解。

现在,我们跟着数字2一起去走一趟二分法:

逻辑思路:数字2首先来到了A1:A9区域,一看有9个人,找起来比较累,那就把9分成上下两拨吧,9的中间是几呢?正好是个单数除不尽,所以给它一个规则,逢单加1再分:那么(9+1)/2=5,好了,中间值为5,于是1-9以5(中间值)为界分成了两拨,分好之后先来看看目标值2<>中间值5,所以无法直接找到结果,没有结果就接着比;目标值2<中间值5,默念口诀“大下小上”。于是我们就向上飞到了查找区域的上半部分,如下图。

接下来接着找,从1-4里面再接着找2对应的人吧。4正好是个偶数,可以完美地分成两拨,4/2=2,好了,中间值为2,老规矩,先来看一下,目标值2和中间值是否相等,一看正好相等,那么事情就简单了,不需要再念口诀了,直接找到B1:B9中对应的第二位,得到结果:黄歇。

试想一下,如果我的A列不是升序会怎么样呢?用二分法原理去套一下就知道了,这个例子就是个常态例子了。

逻辑思路:目标值7>中间值6,且7<>6,所以不能直接得到结果,只能默念口诀:大下小上,往下找,下面4个数中间值16,显然目标值7<中间值16,又要念口诀,向上走,找到了最后一个值5,好了,二分到此,已是绝境,无法再分了,那怎么办,就赖到它身上吧,于是返回5对应位置的B列值“无忌”。

接下来再给大家看一张图,如果理解了这张图,那么你就彻底理解了二分法的逻辑:下图为什么显示的结果是个错误值?

这里就不再解释这个逻辑思路了,大家自己思考一下就明白了。

好了,至此我们知道了LOOKUP函数的工作原理,理解了二分法也就理解了,为什么数据区域的条件列需要用升序排列了。

接下来就好办了,以上三个应用例子的公式,用二分法解读一下,这样你就做到融会贯通了:

1、=LOOKUP(J7,A1:F23),这个公式只有两个参数,当第三个参数省略掉的时候,用二分法返回的值是第二个参数对应的位置。

2、=LOOKUP(1,0/((D2:D23=J7)*(C2:C23=K7)),A2:A23),这个公式的用一个表达式“0/((D2:D23=J7)*(C2:C23=K7))”,作为第二个参数,这样第二个参数就形成了一个除了错误值只有唯一满足条件的一个数0,目标值1大于只有一个满足数据的数0时,就只能赖到它身上,然后返回应的A列值,于是就得到了我们要的结果。

3、=LOOKUP(9^9,RIGHT(G2,ROW($1:$9))*1),这个公式其实和公式1的原理一样,只是人为构建了一个升序数组。

打通这些关节之后,再来看看类似的这种公式“LOOKUP("座",A:A)”、“LOOKUP(9^9,A:A)”,还有难度吗?是不是现在面对它们也可以莞尔一笑了呢?