你担心的查找函数原来是这样的
十年前,Excel函数方兴未艾,大家都热衷于探索函数世界。LOOKUP是当时公认的超级函数之一。super有两个意思。一方面,LOOKUP非常强大,在数据查询方面基本上没有什么是它解决不了的。另一方面,这个家伙很复杂,有人甚至根据它的语法猜测这个函数在编程中使用了经典的算法二分法(但事实证明,这个猜想在逻辑上是完全不一致的,如果你感兴趣,我们最后再谈这个)。
这是十年前的事了。现在十年过去了,连复杂的功能都被总结成简单的套路。
LOOKUP函数的官方语法有两个——,但都没有太大的实用价值。这个功能已经发挥到了官方定义的语法变成废纸,民间套路变成事实语法的地步。所以看看所谓的官方语法就好了。
1语法向量形式
=LOOKUP(lookup_value,lookup_vector,result_vector)
2语法数组形式
=LOOKUP(lookup_value,数组)
.自古情深留不住,套路总会赢得人心。网上流传的LOOKUP例程很多,但看透了外表之后,只有两个核心规则:区间查询和条件查询。
另外,虽然是老生常谈,但还是有必要说一下,如果你是函数新手,这一章中有一些你看不懂的部分,你很想看懂,请重读函数基础的要领,也就是函数教程系列的第2、3、7章,尤其是第7章:为什么0、1是Excel函数逻辑运算的核心要领?
一个
区间查询
LOOKUP函数的区间查询例程的语法格式如下:
=LOOKUP(查找值,按第一列升序排列的查找区域,结果区域)。
需要注意的是,使用该例程时,搜索范围的第一列必须按升序排列。
举个例子。
如下图所示,A:C数据区的评分应按照F:G的评分标准进行评分。大于等于0且小于60为通过,大于等于60且小于80为通过,大于等于80且小于90为优秀,大于等于90为优秀,大于等于95为优秀……也就是将查询区域分为多个部分,并按升序排列。
在C2单元格中输入以下公式,然后复制并填写:
=LOOKUP(B2,F:F,G:G)
f列是按升序排列的搜索区域,g列是其对应的结果区域。LOOKUP从搜索区域中查找小于或等于搜索值的最大值,例如查找81,查询区域(f列)中小于该值的最大值为80,因此它首先得到结果80,然后在与80对应的g列中返回结果“优秀”。
.可能需要再次强调的是,这种区间查询方式要求搜索区域的第一列必须升级排列!有些朋友可能会说f列没有升序,F2单元格的0比F1单元格的“分数”小。没关系。LOOKUP非常聪明。他知道如果你不说F1是不是冠军线。
此示例也可以使用以下公式:
=LOOKUP(B2,F:G)
这是因为当搜索区域为多列且结果区域被省略时,LOOKUP将默认搜索区域的第一列(在本例中为F列)为搜索区域,最后一列(在本例中为G列)为结果区域。
请注意,我们谈论的是最后一列,而不是第二列。
例如,在单元格D2中输入以下公式以返回列h的评级
=LOOKUP(B2,F:H)
LOOKUP默认将第一列f作为搜索区域,最后一列h作为结果区域。
看广告放松一下。
毕竟,没有广告的推文是不真诚的。
2
条件查询
LOOKUP函数的条件查询例程的语法格式如下:
=LOOKUP(大于查找范围、查找区域、结果区域中相同类型的所有值的值)。
该例程返回与搜索区域中相同类型的最后一个数据相对应的结果。
例如,查找a列中的最后一个文本:
=LOOKUP(“座位”,A:A,A:A)。
“Block”在文本数据中是一个非常大的值,它比大多数常见的文本值都大,因此此公式返回A列中的最后一个文本值.
因为该公式的搜索区域和结果区域是相同的
当结果区域被省略时,查找的默认查找区域是结果区域。
例如,查找列a中的最后一个值:
=LOOKUP(9^9,A:A)
9 9是9的9次方,这是一个很大的值,比大多数值都大,所以这个公式返回a列的最后一个值。
……
觉得这个套路没有实用价值?
打个响指,然后让我们以不同的形式扩展这个程序.
如下图所示,需要根据A:B列的数据源查询D2单元格中指定姓名的考试成绩。
这是一个单条件查询问题,查找公式如下:
=LOOKUP(1,0/(A1:A10=D2),B1:B10)
(A1:A10=D2)部分判断a1: a10区域的值是否等于D2,并返回由逻辑值TRUE和FALSE组成的存储器阵列3360。
{ FALSE真;假;假;假;假;假;假;假;FALSE}
如果将0除以数组,0/TRUE会得到0,0/FALSE会得到错误值#DIV/0!它返回由0和错误值组成的内存数组:
{#DIV/0!0;#DIV/0!#DIV/0!#DIV/0!#DIV/0!#DIV/0!#DIV/0!#DIV/0!#DIV/0!}
lookup有自己忽略错误值的天赋,lookup值1比LOOKUP范围内的全零都大,所以这个公式可以直接返回最后一个限定值对应的结果。
总结一下这个公式,它变成了一个经典的LOOKUP单条件查询例程:
=LOOKUP(1,0/(条件区域1=条件值),结果区域)。
……
如果扩展这个例程,可以成为“和”关系多条件查询的经典例程(注意括号的个数和位置):
如果不能完全看到代码,可以向左或向右拖动代码..
=LOOKUP(1,0/((条件区域1=条件值1)*(条件区域2=条件值2)*……(条件区域n=条件值n))、结果区域)。
举个例子。
如下图所示,需要根据A:C列数据源计算出同时满足e列期间和f列名称的数据。
G2公式如下:
=LOOKUP(1,0/((A $ 1: A $ 10=E2)*(B $ 1: B $ 10=F2))、C$1:C$10)
(a $ 1: a $ 10=E2)*(b $ 1: b $ 10=F2),用乘法判断两个条件是否同时成立,返回由逻辑值TRUE和FALSE组成的内存数组。
然后将数组除以0,得到由0和错误值组成的单列内存数组。
1作为查找,查找值大于查找范围内的所有值,因此此公式直接返回最后一个合格的查询结果。
此外,与INDEX MATCH函数不同的是,由于LOOKUP本身就支持数组运算,即使公式进行多次运算(一次计算多个值),也不需要使用数组三键来结束公式输入——,这给公式的编译和维护带来了极大的便利。
……
继续扩展,将上述例程的乘法改为加法,就可以成为“or”关系的多条件查询例程:
如果不能完全看到代码,可以向左或向右拖动代码..
=LOOKUP(1,0/((条件区域1=条件值1)(条件区域2=条件值2)……(条件区域n=条件值n))、result)。
举个同样的例子。
如下图所示,根据A:C列的数据源,需要查询e列名称满足a列昵称或b列全名的结果。
F2公式如下:
如果不能完全看到代码,可以向左或向右拖动代码..
=LOOKUP(1,0/((A $ 1: A $ 10=E2)(B $ 1: B $ 10=E2))、C$1:C$10)
part(a $ 1: a $ 10=E2)(b $ 1: b $ 10=E2)判断两个条件中是否至少有一个成立,返回一个由逻辑值TRUE和FALSE组成的内存数组,剩余的计算步骤返回原始磁道。
……
更进一步,通过FIND功能,它可以成为模糊匹配的查询例程:
=LOOKUP(1,0/FIND(条件区域,条件值),结果区域)。
还是举个例子:
如下图所示,A栏为缩写,B栏为成就。你需要根据D栏的全名找到相应的成绩.
公式如下:
=LOOKUP(1,0/FIND(A$1:A$8,D2),B$1:B$8)
FIND(A$1:A$8,D2),判断A1:A8的值在D2单元格中是否存在,如果存在,返回数字序号,如果不存在,返回错误值,例如,本例返回内存数组:
{#VALUE!3;#VALUE!#VALUE!#VALUE!#VALUE!#VALUE!#VALUE!}
将0除以数组,生成由0和错误值组成的内存数组.下面的计算步骤回到原始轨迹。
放开思路继续延伸,就能得到“和”关系下的多条件模糊匹配套路:
=LOOKUP(1,0/(FIND(条件区域1,条件值1)*FIND(条件区域2,条件值2)),结果区域)。
如果改成加法,就会变成一个有多个条件或关系的模糊匹配例程:
=LOOKUP(1,0/(FIND(条件区域1,条件值1) FIND(条件区域2,条件值2)),结果区域)。
……
三
结束语
分享这么多栗子其实只是LOOKUP在一个相对规则的单元格区域的查询用法,并没有涉及到数据结构转换和字符串处理,也就是说这一切只是LOOKUP强大用法的冰山一角.
所以,当INDEX MATCH说他们比VLOOKUP强一百倍的时候,LOOKUP作为VLOOKUP的大哥,只会冷笑,挽起袖子想,呵呵,我比你们两个的组合强一百倍.
当然,强大并不意味着实用。
就像大炮威力巨大,用它来打蚊子是个笑话。INDEX MATCH比VLOOKUP更强,但在很多情况下,它并不比VLOOKUP更容易编写。LOOKUP比INDEX MATCH更强,但在很多情况下,它的计算效率相对较低。
三者之间的优缺点是什么?我们将在下一章讨论它。
版权声明:你担心的查找函数原来是这样的是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。

















