函数作用

返回向量或数组中的数值

函数语法

1.函数 LOOKUP 的向量形式是在单行区域或单列区域(向量)中查找数值,然后返回第二个单行区域或单列区域中相同位置的数值;

LOOKUP(lookup_value, lookup_vector, result_vector)

2.函数 LOOKUP 的数组形式在数组的第一行或第一列查找指定的数值,然后返回数组的最后一行或最后一列中相同位置的数值。

LOOKUP(lookup_value,array)

原理解释

先看一个例子:
下图中左表和右表只有第5行的会员名子不同,但在第11行查找B对应的消费金额时结果却不同。甚至左表中查找到的是会员A的消费金额。
公式:
B11 =LOOKUP(A11,A2:B8)
E11 =LOOKUP(D11,D2:E8)
001.jpg
那么,为什么会出现这样的情况呢?
lookup函数查找是遵循二分法查找原理,所以要看懂上例中的查找结果,必须要了解什么是二分法查找。

什么是二分法。

从前向后一个一个的查找,是遍历法。二分法不是这样,它是从二分位处查找,如果查找不到再从下一个二分位处查找,直到查找到和他大小相同或比它小的数。

基本原理。

想了解二分法,必须了解下面2个原理。

1.二分位的判定
说白了,二分位就是中间的位置,如果有7个数(lookup函数的第2个参数的总行数),那么第4个数就是中间的位置。
=LOOKUP(A11,A2:B8)
二分法原理01.png

如果有10个数呢,则第5个位置是二分位。这里有一个公式可以计算出来:INT((总行数+1)/2)

2.查找方向确定
当在二分位查找不到时,接下来该怎么查找呢?
当上一次二分位值大于查找的值时,向上继续查找,在二分位上面区域找出新的二分位,直到找出符合条件的值。如下图中,先从第5行查,因为C>B,所以就向上继续查,上面区域D2:D4区域的二分位值是D3,而D3的值是B,则对应的E列值800是是查找结果。
二分法原理02.jpg

当数值小于查找的值时,向下继续按二分法查。如下图中,先查找第5行,发现A,所以向下继续查,在第2个二分位处发现还是小于B的A,就继续向查,因为A8的D>B,所以A7的A最终符合条件(查找到和目标值相等,或比目标值小的值)
二分法原理03.jpg

当二分值等于查找的值时,向下逐个查,最后相邻且相等的值即符合条件。
如下图所示,在A5(第1个二分位)查找到了A,本来查找结果应该是B5的860,但由于A6的值也是A,所以查找结果变成了第6行的值。而A8虽然也是A,但和A5不是连续相等区域。所以结果不是B8。
二分法原理04.jpg

示例解释

区间查找。

【例1】如下图所示,是典型的区间查找公式。查找350对应的提成比率是7%。
LOOKUP示例解释.jpg
查找过徎:
从第1个二分位处(A4)处开始查找,200<350,向下查找。
在第2个二分位处(A6)的值400>350,所以要向上查,上面只有A5一个值300,且该值小于350,所以B5的值即为最终查找结果。

查找最后一个。

【例2】如下图所示,查找顾客B最后一次的消费金额。
VLOOKUP示例解释02.jpg

分析:
这里肯定不能直接用Lookup查找B,否则按二分位查找,结果不一定是最后一个。所以就用0除的方法把符合条件的变成0,不符合条变成错误值:
=0/(A2:A8=A11)
结果是
{0;0;#DIV/0!;#DIV/0!;0;#DIV/0!;#DIV/0!}
由于lookup会过滤掉错误值,所以在lookup眼中,上面的数组是这样的:
{0;0;0}
然后用1查找最后一个0的位置
=Lookup(1,0/(A2:A8=A11),B2:B8)
这里1是任一个大于0的值,因为大于0,所以用二分法查找时,会一直向下查找,直到最后一个0值

总结

lookup的二分法查找,是跳跃式的查找。它总认为被查找的1组值是从小到大排列,如果遇到小的就向下找更大的,如果遇到大的就向上找更小的。

LOOKUP延申解释

根据以上原理,我们再来看LOOKUP的语法:
LOOKUP(lookup_value, lookup_vector, result_vector)
需要注意:

  1. lookup_vector的数值必须按升序排序:...、-2、-1、0、1、2、...、A-Z、FALSE、TRUE;否则,函数 LOOKUP 不能返回正确的结果。文本不区分大小写。
  2. 如果函数LOOKUP找不到lookup_value,则查找result_vector或者array中小于lookup_value的最大数值;
  3. 如果lookup_value小于result_vector或者array中的最小值,函数LOOKUP返回错误值#N/A。

LOOKUP常见用法

逆向查找

如下图,我们需要根据员工姓名,查找员工所在部门:
LOOKUP用法01.png
F5单元格对应的公式为:
=LOOKUP(1,0/(B2:B10=E5),A2:A10)
上面这个公式就是LOOKUP最经典的用法。
=LOOKUP(1,0/(条件),目标区域或数组)
当然,条件可以是多个逻辑判断相乘组成的多条件数组:
=LOOKUP(1,0/((条件1)*(条件2)*(条件3)),目标区域或数组)
上述公式中,0/(B2:B10=E5)会构建一个0、#DIV/0!组成的数组,再用永远大于第二个参数中所有值的1作为查找值,即可查询最后一个满足非空单元格条件的记录。

查找行或列最后一个文本

=LOOKUP("々",A:A)
其中,"々"通常被看作是一个编码较大的字符(输入方式:<ALT+41385>)
也可以用"座"代替"々";

查找行或列最后一个数值

=LOOKUP(9E307,A:A)
其中9E307被认为是接近Excel规范与限制允许键入的最大数值

文本混合行或列取最后一个内容

=LOOKUP(1,0/(A:A<>""),A:A)

模糊查找

需要注意的是,LOOKUP条件查找,不能使用通配符,这里模糊查找用find构建
LOOKUP用法02.png

=IFERROR(LOOKUP(1,0/FIND(A2,E$2:E$13),E$2:E:$13),"")

多区间条件判断

如下图:50分及以下为“极差”,60分及以下“差”,75分及以下为“一般”,85分及以下“较好”,95分及以下为“优秀”,96分及以上为“能手”
LOOKUP用法03.png

=LOOKUP(B2,{0,50,60,75,85,95;"极差","差","一般","较好","能手"})

这里需要注意的是,根据二分法查找的原理,当二分值等于查找的值时,向下逐个查,最后相邻且相等的值即符合条件,而第二个参数又是从小到大排序的,所以,临界取值是等于临界值。比如,50分,对应评分为差。

Last modification:February 13th, 2019 at 11:03 am