解析lookup的经典查找方式.docx
《解析lookup的经典查找方式.docx》由会员分享,可在线阅读,更多相关《解析lookup的经典查找方式.docx(9页珍藏版)》请在冰豆网上搜索。
解析lookup的经典查找方式
解析lookup的经典查找方式
————————————————————————————————作者:
————————————————————————————————日期:
ﻩ
解析lookup的经典查找方式
包括两部分内容:
第一,lookup函数用法介绍;第二,通过实例讲解lookup函数经典的条件查找解法,通用公式基本可以写为:
LOOKUP(2,1/(条件),查找数组或区域)或LOOKUP(1,0/(条件),查找数组或区域)。
-
主讲老师:
卢子老师ﻫ 讲座主题:
解析lookup函数的经典查找方式
学习是需要技巧和经验的。
感谢卢子老师为大家分享和交流他的实战经验。
下面是本期讲座的全部内容。
本期讲座包括两部分内容:
第一,lookup函数用法介绍;第二,通过实例讲解lookup函数经典的条件查找解法,通用公式基本可以写为:
LOOKUP(2,1/(条件),查找数组或区域)或LOOKUP(1,0/(条件),查找数组或区域)。
第一部分:
lookup函数用法介绍
lookup函数和vlookup函数是excel中最常用的两个查找函数。
vlookup函数能做到的lookup函数同样可以做到,而且可以做得更好。
LOOKUP函数有两种语法形式:
向量和数组。
本期就向量形式的展开交流和探讨。
向量形式的语法为:
LOOKUP(lookup_value,lookup_vector,result_vector)
其中的参数意义如下:
Lookup_value:
为所要查找的数值。
Lookup_value 可以为数字、文本、逻辑值或包含数值的名称或引用。
Lookup_vector:
为只包含一行或一列的区域。
Lookup_vector 的数值可以为文本、数字或逻辑值。
Lookup_vector的数值必须按升序排序:
...、-2、-1、0、1、2、...、A-Z、FALSE、TRUE,否则, LOOKUP不能返回正确的结果。
文本不区分大小写。
ﻫ Result_vector:
只包含一行或一列的区域,其大小必须与lookup_vector相同。
ﻫ 比如lookup(A1,B1:
B10,C2:
C11),其中C2:
C11的尺寸要与B1:
B10相同,且如果A1对应B列中的位置是B2的话,那么返回的将是C3的值。
LOOKUP函数说明:
第一,如果函数 LOOKUP找不到 lookup_value,则查找lookup_vector中小于或等于 lookup_value的最大数值。
这就是为何返回最后一个满足条件的值的原理。
ﻫ 第二,如果 lookup_value 小于lookup_vector中的最小值,函数LOOKUP返回错误值#N/A。
利用这个特性,我们可以用=LOOKUP(1,0/(条件),引用区域)这样一个通用公式来作查找引用。
第二部分:
lookup函数实例运用
运用一:
模糊查找
模糊查找的核心是第二个参数排序必须是升序,否则会导致查找值错误。
下图所示的表1是按升序排序的,表2没有排序。
分别在表1和表2下面对应的单元格输入公式。
表1的数据源是按升序排序的,根据lookup函数用法:
=LOOKUP(要查找的数据,查找范围,结果),在C24单元格设置公式:
=LOOKUP(B24,$B$5:
$B$17,$C$5:
$C$17),然后下拉得到正确结果。
表2的数据源是没有排序的,在J24单元格输入公式:
=LOOKUP(I24,$I$5:
$I$17,$J$5:
$J$17) ,然后下拉,发现J25单元格得到的结果是H126,显然不对。
通过表2的源数据可以看到I25单元格对应的值应该为J8单元格的值H142。
为什么会出错呢?
这就印证了第一部分的用法介绍中所讲到的:
Lookup_vector的数值必须按升序排序:
...、-2、-1、0、1、2、...、A-Z、FALSE、TRUE,否则,LOOKUP不能返回正确的结果。
文本不区分大小写。
模糊查找,数据源一定要以升序先进行排序,否则就会出错。
在数据源没有排序的情况下,如何才能查找到正确结果?
LOOKUP函数有一个经典的条件查找解法,可以很好的解决此问题。
在第一部分有提到,通用公式基本可以写为:
LOOKUP(2,1/(条件),查找数组或区域)或LOOKUP(1,0/(条件),查找数组或区域)。
公式中的2、1、0等数字的含义是什么?
首先,条件是一组逻辑判断的值或逻辑运算得到的由TRUE和FALSE组成或者0与非0组成的数组,因而:
0/(条件)的作用是用于构建一个由0或者#DIV!
0错误组成的值。
比如数据源中能查找到对应值就是ture,没有就是false。
形式如:
0/True=0,0/false=#DIV0!
查找到就0,没有就是错误值。
如果LOOKUP 函数找不到lookup_value(即:
1),则它与lookup_vector中小于或等于lookup_value的最大值(即:
0)匹配。
也就是说,要在一个由0和#DIV!
0组成的数组中查找1,肯定找不到1,因而将返回小于或等于1的最大值(也就是0)匹配。
用大于0的数来查找0,肯定能查到最后一个满足条件的。
以上的原理,被俗称为“以大欺小法”。
这种技巧在LOOKUP函数上的运用是很常见的。
利用上面的原理,不管有没有排序,只要使用上面的“以大欺小法”都能得到正确结果。
比如上面实例中,在J25单元格输入公式:
=LOOKUP(1,0/(I25=$I$5:
$I$17),$J$5:
$J$17),就可以了。
运用二:
精确查找
第一,查找的数据没有对应值,可以利用ISNA(ISERROR)函数屏蔽错误值。
如上图所示,表3是数据源,在下面左边根据“番号”查找“俗称”。
单击C51单元格,输入公式=LOOKUP(1,0/(B51=$B$42:
$B$45),$C$42:
$C$45),然后下拉可以看到下面的C52和C54单元格出现错误值。
这种情况可以利用ISNA(ISERROR)函数屏蔽错误值。
只要在公式外面嵌套个if(isna(lookup(),"",lookup()),这样的形式就可以把错误值屏蔽。
在H51单元格,输入这样的公式:
=IF(ISNA(LOOKUP(1,0/(G51=$B$42:
$B$45),$C$42:
$C$45)),"",LOOKUP(1,0/(G51=$B$42:
$B$45),$C$42:
$C$45)),下拉,就可以屏蔽错误值了。
将错误值屏蔽了,表格就好看多了。
上面公式中,"",是显示空的意思,错误就显示空,没有就查找。
第二,借助错误值来判定产品是否存在。
下图所示根据左边的数据源,来判定右边对应的数据是否在番号列中。
只需要嵌套一个isna函数就可以做到,如果没有存在就错误,有存在就......这样的形式。
在H62单元格输入公式:
=IF(ISNA(LOOKUP(1,0/(G62=$B$62:
$B$74))),"否","是"),下拉就即可得出结果。
“图啥”网友问:
iserror与isna函数的区别。
ISNA只屏蔽#N/A错误,ISERROR屏蔽所有错误。
第三,LOOKUP函数多条件查找。
如上图所示,根据“俗称”和“订单号”来查找“订单数”和“尾数”,可以套用这样的公式:
=LOOKUP(1,0/(条件(1)*(2)*(3).。
。
。
。
。
),引用区域),用*或&将各个条件连接起来,*就是和的意思。
此题有两种方法:
ﻫ 第一,在K112单元格输入公式:
=LOOKUP(1,0/(($I112=$B$112:
$B$120)*($J112=$C$112:
$C$120)),D$112:
D$120),复制公式就可以得到结果。
ﻫ 第二,另外也可以使用这个公式:
=LOOKUP(1,0/($I112&$J112=$B$112:
$B$120&$C$112:
$C$120),D$112:
D$120)
第四,含某个字符查找。
按照上图所示,根据左边的数据源,来对含有某个字符进行查找。
单击G128单元格,输入公式:
=LOOKUP(1,0/(FIND($F128,$B$128:
$B$131)),B$128:
B$131),就可以得到结果。
VLOOKUP函数与lookup函数对比:
第一,在多条件查找方面,就能看出lookup函数好用。
用vlookup多条件查找,最简单的方法就是借用辅助列。
ﻫ第二, VLOOKUP函数对于反向查找是需要嵌套其余函数才能实现,而LOOKUP函数没有正反之分,因此在这方面LOOKUP函数会更加容易实现。
第三,vlookup在查找字符方面,可以使用*号类通配符。
LOOKUP是不支持通配符的,但可以使用FIND(查找字符,数据源区域)的形式代替。
在前面的话:
不要迷恋二分法,二分法只是个传说。
因对LOOKUP二分法的研究,可能让人看起来貌似gouweicao78水平很高深。
但本人一方面尽力让大家能看懂它,另一方面并没有提倡过大家一定要看懂二分法,因为升序查找,不需动用“二分法”,仅函数帮助也能说明白。
对于这个原理的探究,仅仅是函数发烧友们的乐趣。
ﻫ怎样看待LOOKUP的“高效函数”之称
第一,LOOKUP使用二分法原理,因此具有极高效率的运算方式;但是只推荐升序查找用它,升序的时候。
ﻫ第二,LOOKUP(2,1/(条件),……,尽管是因为“二分法”让LOOKUP能找到最后一个满足条件的记录,但是,“条件”,比如(A1:
A10="张三")——首先是一个数组运算,然后1/条件又来一次数组运算,最终才用LOOKUP二分法。
这么一个“普通公式”中暗藏数组运算的东西,让“高效函数”背上了黑锅。
ﻫ【正文】ﻫLOOKUP函数有一个经典的条件查找解法,通用公式基本可以写为:
1.LOOKUP(2,1/(条件),查找数组或区域)
2.或LOOKUP(1,0/(条件),查找数组或区域)
很多初学者对此感觉非常诧异就,主要疑惑有:
ﻫ1、公式中的2、1、0等数字有什么含义,明明在查找条件与这3个数字根本毫无联系,怎么能得到正确结果?
ﻫ2、明明LOOKUP函数说明需要“升序”查找,否则可能无法返回正确的值,上面这种解法又是如何得改变这一说法呢?
ﻫ3、据说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,则它与lookup_vector 中小于或等于lookup_value 的最大值匹配。
3、如果lookup_value小于lookup_vector中的最小值,则 LOOKUP会返回 #N/A错误值。
【释疑】简要地说,从逻辑推理来看:
ﻫ1、首先,条件是一组逻辑判断的值或逻辑运算得到的由TRUE和FALSE组成或者0与非0组成的数组,因而:
1/(条件)的作用是用于构建一个由1或者#DIV!
0错误组成的值。
ﻫ2、根据LOOKUP函数说明中的这一条:
ﻫ如果LOOKUP函数找不到 lookup_value(即:
2),则它与 lookup_vector中小于或等于lookup_value的最大值(即:
1)匹配。
ﻫ也就是说,要在一个由1和#DIV!
0组成的数组中查找2,肯定找不到2,因而将返回小于或等于2的最大值(也就是1)匹配。
为什么要用2来查找1或用1来查找0呢?
因为如果有多个与第1参数相等的值,则Lookup就不一定返回“最后一个”所对应的记录,所以必须养成一个良好习惯,
而不要用:
LOOKUP(1,1/(条件),……,或LOOKUP(,0/(条件),……
ﻫ3、如果有多个满足条件的纪录,为何只返回最后一个,而不是第一个或其他呢?
这个解释就需要二分法流程图的模拟了。
而对于一般使用者来说,只需要记住“查找满足条件的最后一个记录”可以使用通用公式
1.LOOKUP(2,1/(条件),查找数组或区域)
2.或LOOKUP(1,0/(条件),查找数组或区域)