一、基础知识
先来带小伙伴们简单复习一下LOOKUP函数的基础用法,语法是:=LOOKUP(查找值,查找向量,[返回向量])。第二参数查找向量大家可以简单的理解为查找值所在的一行或一列的数据区域,第三参数返回向量就是函数结果值所在的一行或一列的数据区域,第三参数可省略,省略时返回向量与第二参数一致。
需要注意一下几点:
1.常规用法时,查找向量的数据区域必须为升序排列,高阶用法不用;
2.第二和第三参数需要一一对应;
3.查找值比查找向量中的数值都小的时候返回错误值#N/A;
4.查找向量中存在多个重复值,会默认匹配最后一个;
5.查找值在查找向量中不存在的时候,会匹配到比查找值小且最接近于查找值的那个值;
6.LOOKUP函数会忽略错误值和空值。
大家只需记住一点,在使用LOOKUP函数进行常规用法时,对查找向量进行升序排列即可,否则可能会返回错误值#N/A。将第一参数设置为1或0属于高阶用法,无需排序。
二、单条件查询
如图1所示,查询“诸葛亮”所在的部门,其公式为:=LOOKUP(A12,A1:A8,E1:E8),也可以写成:=LOOKUP(1,0/(A12=A2:A8),E2:E8)。

第一种写法很好理解,主要是第二种。LOOKUP函数有一个重要的特性,当查找值在查找向量中并不存在的时候,会匹配查找向量中的最接近于查找值且比查找值小的那个值。A12=A2:A8会形成逻辑值数组{FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;TRUE},逻辑值进行四则运算的时候,TRUE可以视为1,FALSE可以视为0,用0除以逻辑值的目的是为了强制让分母不为0,只有当分母为1也就是TRUE的时候(条件满足的时候),才不会生成因分母为0形成的错误值#DIV/0!,因此0/(A12=A2:A8)会形成数组{#DIV/0!;#DIV/0!;#DIV/0!;#DIV/0!;#DIV/0!;#DIV/0!;0},其中的0即为0/1后的值,也就是条件满足即诸葛亮等于诸葛亮返回TRUE,用0除以TRUE得到的值。
查找值1在第二参数{#DIV/0!;#DIV/0!;#DIV/0!;#DIV/0!;#DIV/0!;#DIV/0!;0}中不存在,根据前面说的LOOKUP特性当查找值不存在会返回接近查找值且比查找值小的那个值,第二参数中只有0比1小,然后函数最终返回0所对应的第三参数中的值即“诸葛亮”对应的“推广部”。
三、逆向查询
VLOOKUP函数若要进行逆向查询需要添加辅助列或者配合IF函数,使用比较麻烦,而LOOKUP函数可以直接进行逆向查询。如图2所示,根据部门查找对应的姓名,其公式为:=LOOKUP(B12,E2:E8,A2:A8),也可以写成:=LOOKUP(1,0/(B12=E2:E8),A2:A8)。
四、多条件查询
VLOOKUP函数进行多条件查询需要运用&连接符和IF函数,操作起来较为繁杂,LOOKUP函数就简单的多。如图3所示,查询女张三对应的薪资,其公式为:=LOOKUP(1,0/(B12=A2:A8)*(C12=C2:C8),F2:F8)。相比单一条件查询,这里用*表示“与”的关系也就是同时满足两个条件,(B12=A2:A8)*(C12=C2:C8)即为{TRUE;FALSE;FALSE;TRUE;FALSE;FALSE;FALSE}*{FALSE;TRUE;FALSE;TRUE;TRUE;FALSE;FALSE},上面已经说过逻辑值进行四则运算时,TRUE视为1,FALSE视为0,因此结果为{0;0;0;1;0;0;0},其中1即为两个条件都满足时返回的值,其它方面与单一条件查询原理一致就不重复的赘述了。
五、关键词查询
根据关键字符串查询全部字符串,如图4所示,根据关键词查询对应公司全称,LOOKUP函数不支持通配符,需要配合FIND函数,其公式为:=LOOKUP(1,0/FIND(C2,$A$2:$A$5),$A$2:$A$5)或者=LOOKUP(1,FIND(C2,$A$2:$A$5),$A$2:$A$5),FIND(C2,$A$2:$A$5)返回{1;#VALUE!;#VALUE!;#VALUE!},0/FIND(C2,$A$2:$A$5)返回{0;#VALUE!;#VALUE!;#VALUE!},第三参数$A$2:$A$5返回{"水滴科技有限公司";"山水无限有限公司";"琅琊矿泉水有限公司";"浮山教培有限公司"},查找值1在第二参数{0;#VALUE!;#VALUE!;#VALUE!}不存在,会匹配到比1小的数值0,0对应的结果值就是第三参数中的"水滴科技有限公司"。

如图4-1所示,根据全称查询对应的简称,其公式为:=LOOKUP(1,FIND($A$2:$A$5,C2),$A$2:$A$5)或者=LOOKUP(1,FIND(A2,$C$2:$C$5),$A$2:$A$5),原理与上述一致。

六、横向查询
如图5所示,查询王五2月的销量,其公式为:=LOOKUP(G2,B1:E1,B3:E3),与常规用法一致,只不过这里的第二、第三参数是横向的数据区域。

七、提取数字
如图6所示,字符串中的数字分别在开头、末尾和中间,要分别提取出来,怎么操作呢?提取第一个字符串中的数字,公式为:=LOOKUP(9E+307,LEFT(A2,ROW(1:15))*1),提取第二个公式为:=LOOKUP(9E+307,RIGHT(A3,ROW(1:15))*1),提取第三个公式为:=LOOKUP(9E+307,MID(A4,MATCH(1,MID(A4,ROW(1:15),1)^0,0),ROW(1:15))*1),此处要按下Ctrl+SHIFT+ENTER三键。
ROW(1:15)会形成1,2,3……15组成的数组,配合LEFT或RIGHT函数,分别从字符串左边或后边提取1,2,3……15个字符,以,LEFT(A2,ROW(1:15))为例,提取出的字符为{"5";"52";"520";"520小";"520小包";"520小包E";"520小包Ex";"520小包Exc";"520小包Exce";"520小包Excel";"520小包Excel";"520小包Excel";"520小包Excel";"520小包Excel";"520小包Excel"},此数组中的数字是文本型数字,我们要将其转化为数值型数字,在后面*1或者除以1都可以,那么LEFT(A2,ROW(1:15))*1形成的数组即为{5;52;520;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!},LOOKUP第一参数我们设置为Excel中最大的数值9E+307,这样的话,不管字符串中的数字有多大,我们都能保证它比9E+307小,并且匹配到离9E+307最大的数字即520,第三参数省略时与第二参数一致,即函数最终返回520。
数字在字符串中间,此公式的难点在于确定第一个数字出现在字符串中的位置,我们可以这样思考:先将字符串中的每个字符都单独提取出来,然后^0,表示乘以0次方,我们知道,除了0以外的任何数字的0次方都等于1,这样就能将提取出的每个数字转化为1,然后我们再利用MATCH函数,将其第一参数设置为1.以此确定第一个数字1在字符串中的开始位置,有了开始位置,我们就能利用MID函数配合ROW数组提取出这样的数组{"2";"23";"233";"2333";"2333E";"2333Ex";"2333Exc";"2333Exce";"2333Excel";"2333Excel";"2333Excel";"2333Excel";"2333Excel";"2333Excel";"2333Excel"},然后再这个数组后面*1,将其文本型数字转化为数值型数字,继而匹配到离9E+307最近的数字2333。八、模糊查找
9E+307是Excel中最大的数值,“座”是Excel中最大的字符编码,也就是升序排列时,“座”会排在最后一位。根据查找值不存在会返回查找向量中接近且小于查找值的某个值的特性,我们可以用LOOKUP函数进行模糊查找。
如图7所示,查找“A列最后一个数值”,公式为:=LOOKUP(9E+307,A:A),查找“A列最后一个文本”,公式为:=LOOKUP("座",A:A),查找“A列最后一个非空单元格”,公式为:=LOOKUP(1,0/(A:A<>""),A:A)。

A:A<>""表示A列中有数据的单元格返回TRUE,无数据的空单元格返回FALSE,0/(A:A<>"")返回0和#DIV/0组成的数组,数组中有多个0,默认会匹配到最后一个0。
再来看图7-2所示,求“第二个鼠标对应的销量”,公式为:=LOOKUP(1,0/(A2:A9=D3),B2:B9)。这里如果用常规用法=LOOKUP(D3,A1:A9,B1:B9),结果为25就会出错,前面已经说过使用常规用法时,需要对查找向量进行升序排列,如图7-3所示,在对A列进行升序排列后,结果就正确了。


九、区间查找
如图8所示,根据右侧的分数等级评价原则对左侧的学生成绩进行评价,我们先添加辅助列,取每个分数区间的最小值,在E2单元格输入公式:=LOOKUP(D2,$G$2:$G$6,$I$2:$I$6),并向下填充即可。需要注意的是,这里是常规用法,要对辅助列及其所属的数据区域进行升序排列!此案例使用最多的通常是IF函数:
十、合并项查找
如图9所示,A列是合并项,根据姓名查询对应的部门,公式为:=LOOKUP("座",INDIRECT("A1:A"&MATCH(D2,B1:B9,0)))。

MATCH(D2,B1:B9,0)会得到姓名在B列中的行数,再结合INDIRECT函数确定“部门”的数据范围,INDIRECT返回的结果为{"客服部";0;0;"推广部";0},Excel中空单元格用0代替,第一参数设置为"座",以此来匹配数组中最后一位文本字符即“推广部”。
关注小包