分享

你懂这个LOOKUP(1,0/(A:A<>""),ROW(A:A))?

 Excel办公实战 2021-06-29


今天我们就来聊聊LOOKUP查询返回最后一个满足条件的情况,到底是什么原理,如何真的掌握他!

写在前面,LOOKUP(1,0/……) 基本已经是一个套路或者说是模板,如果你只想解决问题,那么直接套用即可,可以告诉你100%返回最后一个满足条件对应的结果!

但是如果你想了解背后的原理,那么可以看下去!因为掌握他,就需要我们去学习二分法

二分法,其实非常简单,如其名,二分,或者说是每次对半砍

洗把脸,我们开始通过案例来说明:

二分法原理详解

我们要使用LOOKUP,那么首先要明白LOOKUP的一些特性:
官方完整说明如下:


本着保姆级服务的原则,我们还是给大家稍微解读一下其中的重点好要点!

LOOKUP(lookup_value, lookup_vector, [result_vector])

1、lookup_vector 中的值必须是升序!这点说的很明白,但是如果你说我就不升序,我就乱序,你能那我怎么的???  不好意思,你犟脾气,他比你更狠! 不管你怎么搞,LOOKUP都认为你是升序的,继续按升序处理! 这点很重要!

2、结果是返回小于等于查找值的最大值!
3、第三参数可以不写,返回第二参数满足条件的值!

本文由“壹伴编辑器”提供技术支持

简单了解一下,然后我们看案例来进一步说明:

问题:这个公式的结果12是怎么得到的?


详细解读:
1、二分法有一个二分,那么这个“二”是怎么判断的呢?
中位值 = INT((首+尾)/2)

▍第1次比较

中位值确定:=INT((1+10)/2)= 5

98>60,按照默认升序的原则,我们要查找的内容只能在前半段

▍第2次比较

中位值确定:=INT((1+4)/2)= 2

99大于60,所以值应该在左侧,也就是前半段!

▍第3次比较

中位值确定:=INT((1+1)/2)= 1
12<=60? 满足条件,所以结果为12


如果我们第一个值不是12,而是大于60会怎么样? 按照LOOKUP原理,要求返回小于等于查找值的最大值,如果最后一个还是比他大,说明没有比他小的了,所以肯定返回错误值!

修改为61,结果是错误值!


本文由“壹伴编辑器”提供技术支持
从以上我们还要强调的内容:
1、LOOKUP要求第二参数是升序,即使你不按要求,他也认为你是升序的,不管实际如何?他都会按照二分法去查找!

2、由于LOOKUP采用二分法,所以他属于“快函数”,要比那些遍历查找的方式要快太多!

3、所谓“二分法”,没有那么什么,就是在始终是升序的基础上每次“对半砍”




本文由“壹伴编辑器”提供技术支持
以上你看懂了的话,我们就可以来说说,我们今天的主题了

▼我才是今天的主角儿!
=LOOKUP(1,0/(A:A<>""),ROW(A:A))

这个14也就是最后一个不等于空的对应的行号,也是最后一个有内容单元格的行号


这个区域太大了,我们缩一点,只要包括查询区域即可!

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

看一下 =(A1:A20<>"") 的结果

=0/(A1:A20<>"") 的结果,只有0和错误值,错误值会被忽略点,剩下的就都是0了!



重点来了!重点来了!重点来了!重点来了!

1、LOOKUP第二参数默认升序,不管你怎么折腾,在他眼里也都是升序的!

2、查找值 1大于0,那么每次比较,都会判断结果在后半段!因为升序,所以,在LOOKUP眼中,后面的0是比前面的0大的! 

为什么?因为升序呀!!!什么?你说都是0?  不好意思!LOOKUP说,我认为他是升序,他就是升序的!

所以后面肯定有比这个大的!,所以他会一直往后“二分”,直到最后一个,判断是小于等于1的,所以返回最后一个


本文由“壹伴编辑器”提供技术支持

这么说,你要是还看不懂,我真的救不了了!今天你学废了吗?



    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多