VLOOKUP&LOOKUP双雄战

EXCEL函数江湖烽烟再起,函数大擂台迎来两位重量级选手。守擂者是号称全民偶像、人见人爱车见车载的巨星级函数VLOOKUP,挑战者则是名气不大实力强劲高手的LOOKUP函数!这对与生俱来的对手,究竟会在函数擂台上擦出怎样的火花?青梅煮酒论英雄,让我们拭目以待!

VLOOKUP的漂亮开局

***ROUND 01 基本用法比拼

VLOOKUP是在表格或区域中按列查找内容的函数,它的基本语句是:

=VLOOKUP(查找值,查找区域,返回值的列号,精确/近似匹配)

其中:参数1必须出现在参数2的首列,参数3必须在参数1和参数2的列数之间,参数4可以表示为1或0。举个例子,某位海迷想要根据姓名找出人物对应的绰号,于是,他写了如下公式:=VLOOKUP(D2,A1:B12,2,0)

图01

公式说明:

VLOOKUP函数的参数1是单元格D2——尤斯塔斯·基德,它在参数2A1:B12的首列A1:A12之中,参数3的值为2,表示返回参数2A1:B12的第二列,即B列中的绰号。参数3不能大于参数2的最大列数2。参数4为0,表示精确匹配。于是整个函数公式的含义可以表达为,从A1:B12的首列中找出值等于D2的单元格,返回A1:B12的第二列中与之对应的内容。

LOOKUP函数用于查询一行或一列并查找另一行或列中的相同位置的值,它的基本语句是:

=LOOKUP(查找值,查找区域,[返回区域])

其中,参数2查找区域须按升序排列。参数3返回区域不是必填项目,当参数3被省略,则以参数2查找区域的最后一行或最后一列作为返回区域,我们称这种使用方式为数组形式。但是我们通常建议使用向量形式,即保留参数3,此时查找区域和返回区域均为一列或一行,且大小相同。同样的例子,我们看看LOOKUP是怎么做的?

=LOOKUP(D9,A1:A12,B1:B12)
图02

什么情况?我用眼睛都能看出的查询结果LOOKUP竟然算错了,莫非LOOKUP函数失灵了?当然不是,你再返回上一段看一下,没错,标红部分,参数2查找区域须按升序排列。

升序排列!升序排列!升序排列!重要的事情说三遍,是谁的小眼睛还没有看老师!

SO,如果LOOKUP函数像这样不听使唤,那你有可能掉进了LOOKUP的陷阱里,此时你应该检查参数2是否是按升序排列。如下图,当A2:A12升序排列后,得到了正确结果。

图03

PS:与VLOOKUP的遍历查询法不同,LOOKUP的查询原理是二分法,LOOKUP陷阱正与二分法有关,感兴趣的小伙伴可以看看往期教程《LOOKUP函数用法全解(下)——LOOKUP函数的二分法原理》。

由此观之,在基本用法的较量中,LOOKUP的语句较复杂且需要对查找区域进行升序排列,不如VLOOKUP函数简洁实用。

图04

第一回合,函数基本用法,VLOOKUP小胜!!!

***ROUND 02 模糊包含查找比拼

有时候,我们需要查找的数据并不能直接通过LOOKUP和VLOOKUP的基本用法精确匹配。换句话说,查找值和查找区域存在某种肉眼可见的对应关系,但并非完全相等。比如,对《海贼王》 这部漫画不熟悉的小伙伴可能记不全主人公路飞的全名,此时,我们如何利用路飞这个简称在对照表中找到他的绰号呢?这种问题在工作中也非常常见,比如已知供应商简称找全称、已知名字找全名等等。类似这样的问题,我们姑且称之为“模糊包含查找”。

对付“模糊包含查找”问题,我们不能简单地使用VLOOKUP或LOOKUP函数的基本用法来解决,不然结果是前者“不知所措”,后者“张冠李戴”!!!

图05

那么遇到这种问题,VLOOKUP和LOOKUP是不是就都束手无策了呢?当然不是,作为实力强劲的明星查询函数,怎能就此溃败!和基本用法一样,VLOOKUP和LOOKUP在解决模糊包含查找问题时也是“你有你的张良计,我有我的过墙梯。”

先来看看VLOOKUP函数的张良计——通配符,星号"*"和问号"?"。

星号"*":通配任意个字符,通常单独使用,表示此处可以没有字符,也可以有任意个字符。

问号"?":通配单个字符,可以重复使用,表示此处必须有与问号相同个数的字符。

我们将通配符置于查找值的前面或后面,用英文双引号将其圈定表示常量字符,并用文本连接符"&"连接起来,形成“""&B2”或“""&B2&"?"”之类的查找值作为VLOOKUP的第一参数,其余参数与基本用法一致即可。

=VLOOKUP("*"&D3&"*",A1:B12,2,0)
图06

公式说明:查找值中使用了通配符,"*"&D3&"*"表示D3的前后均允许存在任意字符,即只要查找区域首列A2:A12中的单元格值包含D3(路飞),就返回对应的B列值。这就是VLOOKUP的模糊包含查找之道!

我们再来看看LOOKUP函数的过墙梯——FIND函数

由于LOOKUP函数首个参数不能使用通配符,我们只能通过文本查找函数FIND来帮助LOOKUP识别查找区域中是否包含查找值。FIND函数的基本语句是=FIND(查找文本,包含查找文本的文本),它可以返回所查找的文本在包含其的文本中首字符出现的位置,例如FIND(孙,孙悟空)=1,FIND(悟空,孙悟空)=2。

我们使用FIND函数来构造一个全新的查找区域,再赋予LOOKUP的第一参数一个足够大的数字,即可完成LOOKUP的模糊查找。

=LOOKUP(100,FIND(D9,A2:A12),B2:B12)
图07

公式说明:查找值100是一个足够大的数,它一定大于FIND函数的任意一个返回值,即它大于查找区域A2:A12的最大文本长度。FIND函数一一查找D9单元格文本“路飞”在A2:A12中的每个单元格文本中出现的位置。如果只有一个单元格包含文本“路飞”,则A2:A12单元格文本中仅有一个单元格返回数字,其余单元格均因不包含文本“路飞”而返回错误值#VALUE!。那么,由FIND函数构成的新查找区域仅由1个数字和多个#VALUE!组成。

图08

由于LOOKUP的查找值100始终大于FIND的返回值,即查找值大于查找区域中的值。根据二分法原理,LOOKUP函数将返回最接近查找值且小于查找值的数所对应的单元格。在这个例子中,100作为查找值,查找区域中除了一个数字6,其他都是错误值,因此只能找到6。6所在的单元格是A9,而A9在返回区域B2:B12中对应的单元格是B9,所以返回B9的值“草帽”。

关键要点:LOOKUP的查找值一定要大于FIND的返回值!!!

图09

由此观之,在模糊包含查找的较量中,VLOOKUP仅凭几个简单符号即可四两拨千斤, LOOKUP却需要劳师动众地搬来FIND救场,VLOOKUP在语句的简便性和易读性上都远超LOOKUP。

图10

第二回合,模糊包含查找,VLOOKUP完胜!!!

LOOKUP剑走偏锋

***ROUND 03 交叉查询

什么是交叉查询?我们可以通过一个查找值查找多个字段。如果被查找的多个字段的排列顺序与查找区域中对应字段的顺序不一致,我们称之为交叉查询。如下,我们要从数据源中查找“阿普”的多个字段“绰号”“能力”“职位”,很显然被查找字段与数据源中字段“职位”“能力”“绰号”的排列顺序不一致,这就是交叉查询,要怎么做呢?

图11

最基础的做法就为每一个查找字段单独设置公式。

  • H3公式 =VLOOKUP($G3,$A$1:$E$12,5,0)
  • I3公式 =VLOOKUP($G3,$A$1:$E$12,4,0)
  • J3公式 =VLOOKUP($G3,$A$1:$E$12,3,0)
图12

这种逐一设置公式的做法很笨拙,除了需要重复输入类似的公式外,还需要人工判别每一个单元格的返回列值。如果查找字段很多,估计会逼疯不少表亲。下面看看小花是如何使用VLOOKUP和LOOKUP做交叉查询的。

VLOOKUP:经天纬地,拿手好戏

VLOOKUP和MATCH这对函数组合正是为交叉查询而生。VLOOKUP通过MATCH函数的协助,自动判断出返回列值。MATCH函数用于返回查找值在某一行/列中的位置,它的语法是MATCH(查找值,查找行/列,查找方式)。此处我们用到的查找方式是精确查找,第三个参数用FALSE或0表示。

图13

公式说明

以B17公式为例,“职位”出现在A1:E1的第三个位置,所以MATCH的返回值为3。

介绍完MATCH函数的基本用法后,隆重介绍EXCEL函数中一种使用频率最高的函数组合——VLOOKUP+MATCH。

=VLOOKUP($G3,$A$1:$E$12,MATCH(H$2,$A$1:$E$1,0),0)
图14

公式说明

VLOOKUP+MATCH组合的基本套路是=VLOOKUP(查找值,查找区域,MATCH(查找字段,字段区域,0),0)。它是在VLOOKUP的基本用法上,将第三个参数返回值列序用MATCH替换,通过匹配,自动返回目标字段在查找区域的列序。

套路的基本要点如下:

  1. MATCH的查找值必须与VLOOKUP查找区域标题行中的某个单元格完全一致。这是高频错误点,需注意空格的干扰!
  2. 为了使公式可以拖动填充,VLOOKUP的第一个参数通常锁定列,如$G3,第二个参数通常锁定行和列,如$A$1:$E$12;MATCH的第一个参数通常锁定行,如H$2,第二个参数通常锁定行和列,如$A$1:$E$1。公式最后是“,0),0)”这样的结构,分别表示MATCH函数和VLOOKUP函数都执行精确匹配。这些细节都是小白容易忽略、出错的地方。

LOOKUP:数组形式,剑走偏锋

说实话,交叉查询,LOOKUP同样无法单干,需要找帮手组团行动,譬如 LOOKUP+MATCH+OFFSET。

=LOOKUP($G3,OFFSET($A$1:$A$12,,,,MATCH(H$2,$A$1:$E$1,0)))
图15

公式说明

该公式使用了LOOKUP的数组形式=LOOKUP(查找值,查找区域),表示在查找区域的首行/列中进行匹配,返回查找区域末行/列中与之对应的值。于是问题的重点就变成了如何使查找区域的末列自动变为返回值的所在列。我们用OFFSET函数和MATCH函数来解决。

OFFSET函数是一个偏移函数,它根据给定的偏移行数和列数从初始位置偏移至指定区域,并返回指定大小的区域,它的语法是=OFFSET(初始区域,偏移行数,偏移列数,[返回区域的行数],[返回区域的列数])

此处我们的初始区域为A1:A12,返回区域仍然是以A1:A12为首列的区域,行、列偏移量皆为0,返回区域的行数也与初始区域一致,因此这三个参数直接用逗号占位,不填数字。最后我们通过MATCH返回匹配列序数,从而确定OFFSET返回区域的列数。公式最终返回以A列为首列、以MATCH返回值为末列,包含1-12行的区域。以H3中的公式为例,MATCH返回5,则OFFSET返回结果是以A1:A12为首列的5列区域即A1:E12。把A1:E12作为LOOKUP数组形式的第二个参数,LOOKUP将查找值$G3在区域A1:E12的首列A1:A12中进行匹配,返回查找区域A1:E12的末列E1:E12中与之对应的值,从而完成交叉查询。

第三回合,在处理交叉查询问题时,VLOOKUP和LOOKUP都能应对自如。

但VLOOKUP的用法较为简单,只需借助MATCH函数即可完成,而LOOKUP函数则需要MATCH和OFFSET两个函数和它配合才能实现。综合看来,后者不如前者简单易学。

***小结:

VLOOKUP+MATCH是查询函数中非常经典的套路,LOOKUP的数组形式在实战中也非常实用,两者都是查询函数学习的重中之重。希望小伙伴们不要只做VLOOKUP和LOOKUP较量中的吃瓜群众,还要能深入了解其原理,掌握用法,提升能力。

LOOKUP守得云开见月明

在前三个回合的较量中,LOOKUP处于下风。第四回合的比赛题目是“区间查询”,简单来说,就是判断某个数值属于哪个区间哪个等级。虽说VLOOKUP和LOOKUP都将利用二分法原理完成区间查询,但二分法是LOOKUP唯一的、根本的内功心法,LOOKUP能否凭此守得云开见月明呢?

“年少万兜鍪,坐断东南战未休。”VLOOKUP和LOOKUP的故事还在继续,刀锋未休!连续吃瘪的LOOKUP试图挽住颓势,“二分法”千呼万唤始出来,精彩马上开始!

***ROUND 04 区间查询

在数值查询中,我们经常需要查找数值所对应的区间。一个经典的问题就是学生成绩等级评定,0-60(不含60)为不及格,60-75(不含75)为及格,75-85(不含85)为良好,85以上为优秀。面对这种问题,你是否还在用IF函数反复嵌套?

图16

太OUT了!!!快来看看VLOOKUP和LOOKUP是怎么做的吧?

在使用这两个函数之前,我们必须按下图所示,对各区间及对应值进行升序排列:

  1. 将数值区间的分界值按升序依次填入连续的单元格,即从最小值到最大值,自上而下填入同一列单元格中。
  2. 各区间分界值采用区间下界值,例如,“及格”区间数值60,“优秀”区间数值85。
  3. 如果最小的数值区间无下界,也必须赋予一个足够小的数值,例如-8∧8,否则公式可能会报错。
图17

接下来就是VLOOKUP和LOOKUP展现战斗力的时候了!!!

VLOOKUP:"一"字之差,难得模糊

VLOOKUP函数的解决之道和其基础用法非常类似,只需将最后一个参数更改为1或TRUE即可。

=VLOOKUP(B2,$E$2:$F$5,2,1)
图18

公式说明:

最末参数是0的时候,VLOOKUP精确查找,采用遍历法原理将查找值与查找区域首列值从上到下逐一比较。但最末参数是1的时候,VLOOKUP模糊查找,采用二分法原理将查找值与查找区域首列的二分位值(中间值)进行比较。模糊查找要得到正确结果,查找区域首列必须升序排列。记住这一点,你就能轻松驾驭区间查找。否则,VLOOKUP区间查找公式将会带来灾难!!!

图19

LOOKUP:基础用法,简单粗暴

同样的问题,LOOKUP是怎么做的呢?基础用法,直接上!!!就是这么简单粗暴!

图20

公式说明:

LOOKUP函数只采用二分法查找,所以只要做好了升序排列和区间设置,按平常基本用法输入公式即可。

区间查找,不论是VLOOKUP还是LOOKUP的查找都采用的是二分法查找。这里以LOOKUP函数为例,说说二分法。

LOOKUP的二分法

LOOKUP总是将查询范围视为一组从小到大排列的有序数组,通过将目标值与查询区域的二分位值进行比较,从而确定目标值出现在查询区域的上半区细分范围(目标值小于二分位值)还是下半区细分范围(目标值大于二分位值)。然后继续将目标值与细分范围的二分位值进行比较,循环往复,直到细分范围不可再分,返回最后一个小于或等于目标值的二分位对应的结果。

特别说明:

  1. 二分位值的确定。如果查询范围的数据个数为奇数,二分位值取中间项;若为偶数,则取中间两项中项序较小的一项;若仅一项,则视该唯一项为二分位值。例如,5个数据,二分值取第3项,6个数据,二分值也取第3项。
  2. 连续相等取末原则。如果二分位值与目标值完全相等,则停止二分法查询,而采用连续相等取末原则返回数据。即,如果从二分位值开始向下存在一个连续等于目标值的区域,则返回这个连续区域最后一个数据对应的值;如果从二分位值开始向下不存在连续等于目标值的区域,则返回二分值对应的值。
  3. 如果目标值大于所有二分位值,则返回查询范围的最后一个值;如果目标值小于所有二分位值,则返回#N/A错误值。

文字生涩,结合实例图解会更加容易!

图21

C2:=LOOKUP(B2,$E$2:$E$7,$F$2:$F$7)

目标单元格B2先与第一个二分位E4比较,21;继续与E2的下半区二分位E3进行比较,2

C3:=LOOKUP(B3,$E$2:$E$7,$F$2:$F$7)

目标单元格B3先与第一个二分位E4比较,3=3;此时停止二分法查询,转为连续相等取末查找。自当前二分位E4开始,E4、E5连续等于3,因此返回E5对应的结果F5,即"D"。图中的E3与E4相邻且等于3,但其在E4上方,故不参与第二阶段的匹配;E7也等于3,但E2:E7区域不是连续等于3的区域,所以E7不参与匹配。只有E5满足条件,位于连续相等区域的最末!!!划重点,LOOKUP这一特性经常与其忽略错误值的特性联用,形成经典的LOOKUP(1,0/(条件)…)结构!这一用法我们后续会详细介绍。

C4:=LOOKUP(B4,$E$2:$E$7,$F$2:$F$7)

目标单元格B4先与第一个二分位E4比较,4>3;转而与E4的下半区E5:E7的二分位E6比较,4>2;继续与E6的下半区二分位E7进行比较,4>3。至此,细分范围不可再分,最后一个小于或等于目标值的二分位为E7,所以返回E7对应的结果F7,即"F"。

第四回合,VLOOKUP和LOOKUP都能很好地解决区间查询问题,但LOOKUP保持了它一贯的用法,所以这一局LOOKUP小胜!

***小结:

二分法是查询函数中最难的知识点之一,尽管为了讲好这一知识点,小花已经费劲心思,但可能很多小伙伴还是无法完全理解。“纸上得来终觉浅,绝知此事要躬行”,希望小伙伴们多多练习,在实操中寻找答案!天下英雄谁敌手,战不止争不休,敬请期待!

LOOKUP乘胜追击

面对VLOOKUP的步步紧逼,LOOKUP终于在第四回合的较量中,凭借二分法遏住颓势。重整旗鼓后,LOOKUP吹响了反攻的号角,LOOKUP的1/0结构正式登场,犀利进攻,看VLOOKUP如何应敌!

***ROUND 05 横向查询

在数据查询中,我们也经常遇到这样的问题,查找范围分布在同一行而非同一列,即横向查询问题。如下图,我们要根据职位查找草帽海贼团中的人物姓名,应该怎么做呢?

图22

LOOKUP:砍瓜切菜,轻松EASY

这种问题对VLOOKUP来说可能充满挑战,但对LOOKUP而言,简直是如砍瓜切菜般轻松EASY!!!

=LOOKUP(B7,B2:K2,B3)
图23

公式说明

LOOKUP相对于VLOOKUP来说是更自由的函数,它对查询区域进行二分法匹配,并不要求查询区域需纵向排列。用LOOKUP来完成横向查询时,其语句和纵向查询并无区别。但在横向查询时,目标区域可以简写为结果区域的首个单元格。这是因为,当LOOKUP的第三个参数被简写时,它会自动横向扩展结果区域直至与查询区域等长!也就是说,本例中的=LOOKUP(B7,B2:K2,B3)=LOOKUP(B7,B2:K2,B3:K3)等同。

VLOOKUP:内有贤臣,外有强援

面对LOOKUP的挑衅,不可一世的VLOOKUP函数绝不轻易认输,横向查询硬上也要上!请出转置函数TRANSPOSE来帮忙。

{=VLOOKUP(B7,TRANSPOSE($A$2:$K$3),2,0)}
图24

公式说明

TRANSPOSE函数是一个转置函数,其效果与选择性粘贴中的转置相同。我们通过TRANSPOSE函数将横向区域转置为纵向区域,然后再用VLOOKUP函数进行纵向查询。“每一个成功的函数背后都有另一个优秀的函数”,大概就是这个道理。注意,该公式为数组公式,输入公式后需按Ctrl+Shift+Enter三键才能返回正确的结果。

当然,打仗亲兄弟,VLOOKUP也没必要事事亲力亲为,有时请个外援能解决的事,何必仰人鼻息。虽说这样做有违决斗精神,但成王败寇,过程,Who care?

=HLOOKUP(B7,$A$2:$K$3,2,0)
图25

公式说明

HLOOKUP函数是VLOOKUP函数的孪生兄弟,其功能和用法与VLOOKUP如出一辙,差别仅在于HLOOKUP是横向查询,即它是在查询范围的第一行匹配目标值,而不是在第一列。本例中,HLOOKUP函数将B7与查询区域第一行A2:K2一一匹配,找到等于B7的H2,返回H2所在列与查询区域第2行对应的单元格H3的值。

第五回合,横向查询,VLOOKUP虽然有TRANSPOSE这样的帮手为内应,更兼亲兄弟HLOOKUP函数这样的外援,但仍难以扭转败局。此番,LOOKUP胜在简单、胜在可缩写,胜在横纵皆宜!!

***ROUND 06 逆向查询

前述应用场景中,查询区域都有一个共同点,即结果区域或结果行列始终在查询区域或匹配行列的右侧或下方,这很符合VLOOKUP的查询要求,因此它总能通过匹配首列返回指定列。但很多时候,结果区域并不总是在匹配区域的右侧,例如:

VLOOKUP:天赋不足,嵌套来补

此时,VLOOKUP函数是不是黔驴技穷了?当然不是,IF(,…)了解一下!

=VLOOKUP(D2,IF(,B2:B9,A2:A9),2,0)
图26

公式说明

本例中我们观察到查询值D2所需匹配的列“恶魔果实”在结果列“人物”的右侧,我们无法正常使用VLOOKUP“匹配首列返回第N列”来完成。所以此时解决问题的思路就是如何让B列“恶魔果实”出现在A列“人物”的左侧,进而将B列作为VLOOKUP查询范围的“首列”。解决这一问题的方法就是IF(,….)结构。我们可以从下面三个方面来理解它:

  1. IF函数是逻辑函数,它的基本语句是=IF(logical_test,value_if_true,value_if_false)
  2. 数值1表示TRUE,0表示FALSE;
  3. 表示由1和0组成的数组。

综上,IF(,….)的首个条件是TRUE和FALSE组成的数组,而IF(TRUE和IF(FALSE又分别返回value_if_true和value_if_false,即IF(,….)的返回值是value_if_true和value_if_false组成的数组。

接下来,小花套用上图具体分解一下。

IF({1,0},B2:B9,A2:A9)
={IF(1,B2:B9,A2:A9),IF(0,B2:B9,A2:A9)}
={IF(TRUE,B2:B9,A2:A9),IF(FALSE,B2:B9,A2:A9)}
={B2:B9,A2:A9}
={"橡胶果实","路飞";"花花果实","罗宾";"黄泉果实","布鲁克";"人人果实","乔巴";"手术果实","罗";"磁铁果实","基德 ";"霸王龙果实","X·德雷克";"城堡果实","卡彭·贝基"}

它的作用是为VLOOKUP构建一个虚拟的查询范围B2: A9,其中匹配列B2:B9在结果列A2:A9的左侧。紧接着,VLOOKUP发挥所长,完成查询工作。

LOOKUP:木有压力,纯属炫技

当然,这类所谓逆向查询,对于LOOKUP函数是不存在任何困扰的。查询区域和结果区域分离,给了LOOKUP很大的便利。但LOOKUP的另一属性却经常困扰使用者,那就是其自带的模糊查询要求——查询区域必须升序排列,否则公式几乎都会出错!这一属性使得很多小伙伴倾向于使用VLOOKUP来解决问题。借着逆向查询这个轻松取胜的回合,小花要为LOOKUP正名:首列不升序,一样可以查询,LOOKUP没有死角!

=LOOKUP(1,0/(B2:B9=D2),A2:A9)
图27

公式说明

在该系列文章中,我们首次使用到经典的LOOKUP(1,0/(条件)……结构。不夸张地说,该结构是史诗级的,它主要用到以下知识点:

  1. LOOKUP函数自带数组运算,无需按Ctrl+Shift+Enter。该结构中的条件通常表示为“匹配列区域=目标单元格”的形式,通过数组运算,相等返回TRUE,不相等返回FALSE。再用数字0除以运算结果,0/TRUE=0/1=0,O/FALSE=0/0=#DIV/0!;即LOOKUP(1,0/(条件)……结构在计算过程中,参数2查询区域是由0和#DIV/0!组成的数组;
  2. LOOKUP的匹配过程会自动忽略错误值,即参数2运算过程中的#DIV/0!将被忽略,仅保留所有的0,即;
  3. LOOKUP采用二分法查询,返回最后一个小于或等于目标值的匹配列值所对应的结果;LOOKUP(1,0/(条件)……结构的查询目标值为1,查询区域是N个0组成的有序数组,所以,最后一个0所对应的值即为公式返回结果。反推,即LOOKUP(1,0/(条件)……结构总是返回最后一个满足条件的值。

本例中的条件为B2:B9=D2,仅B2等于D2,返回TRUE,其余返回FALSE。即0/(B2:B9=D2)的查询区域结果为,LOOKUP忽略错误值后仅B2对应的结果0小于目标值1,所以公式返回B2对应的A列人物名“路飞”。

第六回合,把VLOOKUP吓出一身汗的逆向查询问题,却成了LOOKUP炫技的背景板,高下立现。

LOOKUP野马崛起

作为《VLOOKUP&LOOKUP双雄战》系列文章的收官之战,LOOKUP(1,0/(条件)…结构将纵横查询沙场,所向披靡;而作为对手,VLOOKUP将如何应对?闲话少说,直入正文!

***ROUND 07 缺失查询

在本系列开篇时,VLOOKUP和LOOKUP就在如何通过人物简称查询全称的模糊包含查询问题上有过一番较量,彼时,VLOOKUP略胜一筹。本回合,它们将面对包含查询的逆命题——缺失查询。下图中,我们已知人物全名是特拉法尔加·罗,要查询他所拥有的果实名称。这本来是一个很简单的问题,但是出于某种原因,果实对照表中的姓名并不是全称,而是简称,OH MY GOD,不会真尴尬!!!

图28

LOOKUP函数:信手拈来,花样百出

这类问题对LOOKUP非常简单,特别是在我们讲解了1/0结构以后。

=LOOKUP(1,0/FIND(A2:A9,D3),B2:B9)
图29

公式说明

FIND(A2:A9,D3)用于判断A2:A9中的每一个简称是否被D3全称所包含。若包含,则返回简称在全称中出现的位置,否则公式返回错误值#VALUE!。于是0/FIND(A2:A9,D3)即返回一组由数字0和错误值组成的有序数组,数字0在数组中的位置即查询返回值所在行。接着LOOKUP函数开始发挥作用,忽略错误值,返回小于且最接近于目标值1的查询区域值所对应的值,即最后一个0值所对应的B6的值。详细解读如下:

彩蛋1:你发现了吗?如果LOOKUP的查询值足够大(实际上,大于D3的字符数即可),那么我们大可把FIND函数前“0/”去掉,使用=LOOKUP(100,FIND(A2:A9,D3),B2:B9)这样的公式也可以完成模糊包含查找。

图30

彩蛋2:你发现了吗?彩蛋1的公式竟然和本系列第一篇中的LOOKUP模糊包含查询公式如出一辙,差别仅在于FIND函数的两个参数互换位置。没错,你没看错,这就是神奇的LOOKUP函数,高手的挚爱。

图31

彩蛋3:你发现了吗?LOOKUP结构中“0/”的作用其实是将任何结果都转化为0和错误值,该结构的核心技术是LOOKUP忽略错误值的特性、二分法(默认升序并返回最大的小于等于目标值的值)和自带数组运算。所以,有时我们也可以用LOOKUP(2,1/(条件)…或LOOKUP(0.1,0/(条件)…等等结构来替代,只需确保第一个参数总比第二个参数返回的数组中的最大值大即可!

图32

VLOOKUP函数:最后的倔强

在模糊缺失查询问题上,VLOOKUP本该缴械投降的。但作为大众情人的VLOOKUP一身傲骨,死也要站着死!

=VLOOKUP(D3,IF(,IFERROR(VLOOKUP(T(IF(,"*"&A2:A9&"*")),D3,1,0),1),B2:B9),2,0)
图33

公式说明

一个强行使用两个VLOOKUP的嵌套函数,其大致意思是将A2:A9中被D3包含的文本用D3替换,其余保持不变;然后将替换后的A2:A9和不做改变的B2:B9组成一个新的查询区域;最后再用VLOOKUP的基本套路完成查询。

问:具体运算过程如何理解?
答:不用理解,如遇此类问题,请用LOOKUP!

问:为什么要用两次VLOOKUP,而不使用其他函数替代?
答:丢分不丢人,这是VLOOKUP最后的倔强!

***ROUND 08 多条件查询

在多数Excel实操问题上,往往需要多个条件才能准确指向目标,于是有了多条件求和函数SUMIFS,有了多条件计数函数COUNTIFS。但是没有多条件查询函数VLOOKUPS和LOOKUPS,这是为什么呢?因为这两个函数本身就能实现多条件查询!!!如下例,我们需要通过职位和性别来找到名单中唯一的女性船长并返回她的明细,该怎么做?

图34

VLOOKUP:合纵连横,无往不利

在逆向查询中,我们学习了如何利用IF结构构建列序交换的虚拟数组来完成逆向查询,在这里使用连接符&,我们用它来配合VLOOKUP函数完成多条件查询。

{=VLOOKUP(E3&F3,IF(,C2:C8&B2:B8,A2:A8),2,0)}
图35

公式说明

首先用连接符"&"将E3和F3组合起来,形成新的查询值,即“船长女”;接下来要做的就是构建一个以职位和性别组成的首列并与姓名列组成新的查询范围。我们还是用&来完成,将C2:C8和B2:B8连接起来,形成新的查询列“职位+性别”列,即{"船长男";"航海士女";"船长男";"剑士男";"船长女";"考古学家女";"船长男"},然后使用IF结构将新的查询列与姓名列A2:A8组成新的查询范围,最后VLOOKUP发挥功能,完成查询。此时如果你只是单纯地用Enter来完成计算,可能就要吃瘪了,因为这是一个数组运算,需按Ctrl+Shift+Enter才能完成计算,小伙伴们慎之慎之!!!

LOOKUP:1/0结构真正的战场

我们前面花了很大篇幅来讲解LOOKUP(1,0/(条件)……结构,当然不只是为了完成逆向查询这种简单问题!多条件查询,才是LOOKUP(1,0/(条件)……结构真正的战场!

=LOOKUP(1,0/((E3=C2:C8)*(F3=B2:B8)),A2:A8)
图36

公式说明

该公式使用了LOOKUP(1,0/(条件)……结构的复杂版——LOOKUP(1,0/((条件1)(条件2)…(条件n)),结果列)。它将LOOKUP(1,0/(条件)……结构中的单一条件升级为多条件相乘的形式(条件1)(条件2)…(条件n),利用乘法运算中TRUE=1、FALSE=0的原理,使得只有当所有条件都满足而返回TRUE时,TRUETRUE=11=1,此时0/1等于0;但凡任何一个条件不满足返回FALSE, 0乘以任何数都等于0,此时0/0返回错误值#DIV/0!。于是LOOKUP函数的第二参数查询区域成为一组由0和#DIV/0!组成的有序数组{#DIV/0!;#DIV/0!;#DIV/0!;#DIV/0!;0;#DIV/0!;#DIV/0!}。如前述,LOOKUP可以忽略错误值并返回最后一个小于或等于目标值的二分位值所对应的结果,于是最后一个0所对应的值A6“邦尼”就是公式的返回值。

于是有的小伙伴就要纳闷了,既然VLOOKUP可以用连接符"&"连接多个条件,LOOKUP可以用乘号"*"串联多个条件,它们都能完成多条件查询,那是不是这一回合双方打平啊?当然不是,在多条件查询领域,LOOKUP具有绝对的优势,它不仅能完成和VLOOKUP一样的精确性比对匹配,还能完成区间条件的查询。简单的说,VLOOKUP连接法的多条件查询只能判别查找值和查询区域中的值是否相等,而LOOKUP的0/1结构还能完成大于或小于这类非精确查找的条件判别。

=LOOKUP(1,0/((E3=B2:B7)*(C2:C7<10000)),A2:A7)
图37

公式说明

该公式与上一公式的区别在于,第二个条件的逻辑判断符号不再是等号,而是小于号。

***小结

本节介绍了包含查询和多条件查询这两个难度较高的应用情境,至于多值查询、批量查询等诸多查询高难度用法,还有待小伙伴们进一步去挖掘、去深究!

结束语

本系列,我们从VLOOKUP和LOOKUP这两个函数的基础用法开始,逐步扩展到包含查询、交叉查询、区间查询、横向查询、逆向查询,直至本文讲解的缺失查询和多条件查询,全程深入对比了VLOOKUP和LOOKUP这两个函数,并详细说明了每一个公式的计算原理,重点剖析了VLOOKUP+MATCH、LOOKUP的两分法、LOOKUP(1,0/(条件)……结构等重要知识点。八个回合的较量中,我们发现,常规查询VLOOKUP更具优势,但一旦查询难度上升时,LOOKUP的优势便慢慢显露出来。VLOOKUP像是LOOKUP的便捷版,使用起来更加便利但也有更多限制,LOOKUP则使用起来更加自由但更难把握。至此, VLOOKUP&LOOKUP双雄战就此画上句号,千里良驹VLOOKUP,荒原野马LOOKUP,你更喜欢哪个?

作者: Hugh

Welcome to Wan's world~