今天我们就来聊聊LOOKUP查询返回最后一个满足条件的情况,到底是什么原理,如何真的掌握他!写在前面,LOOKUP(1,0/……) 基本已经是一个套路或者说是模板,如果你只想解决问题,那么直接套用即可,可以告诉你100%返回最后一个满足条件对应的结果!但是如果你想了解背后的原理,那么可以看下去!因为掌握他,就需要我们去学习二分法!二分法,其实非常简单,如其名,二分,或者说是每次对半砍我们要使用LOOKUP,那么首先要明白LOOKUP的一些特性:本着保姆级服务的原则,我们还是给大家稍微解读一下其中的重点好要点!
LOOKUP(lookup_value, lookup_vector, [result_vector])
1、lookup_vector 中的值必须是升序!这点说的很明白,但是如果你说我就不升序,我就乱序,你能那我怎么的??? 不好意思,你犟脾气,他比你更狠! 不管你怎么搞,LOOKUP都认为你是升序的,继续按升序处理! 这点很重要!3、第三参数可以不写,返回第二参数中满足条件的值!1、二分法有一个二分,那么这个“二”是怎么判断的呢?98>60,按照默认升序的原则,我们要查找的内容只能在前半段如果我们第一个值不是12,而是大于60会怎么样? 按照LOOKUP原理,要求返回小于等于查找值的最大值,如果最后一个还是比他大,说明没有比他小的了,所以肯定返回错误值!1、LOOKUP要求第二参数是升序,即使你不按要求,他也认为你是升序的,不管实际如何?他都会按照二分法去查找!2、由于LOOKUP采用二分法,所以他属于“快函数”,要比那些遍历查找的方式要快太多!3、所谓“二分法”,没有那么什么,就是在始终是升序的基础上每次“对半砍”!以上你看懂了的话,我们就可以来说说,我们今天的主题了
=LOOKUP(1,0/(A:A<>""),ROW(A:A))
这个14也就是最后一个不等于空的对应的行号,也是最后一个有内容单元格的行号这个区域太大了,我们缩一点,只要包括查询区域即可!
=LOOKUP(1,0/(A1:A20<>""),ROW(A:A))
=0/(A1:A20<>"") 的结果,只有0和错误值,错误值会被忽略点,剩下的就都是0了!1、LOOKUP第二参数默认升序,不管你怎么折腾,在他眼里也都是升序的!2、查找值 1大于0,那么每次比较,都会判断结果在后半段!因为升序,所以,在LOOKUP眼中,后面的0是比前面的0大的!(为什么?因为升序呀!!!什么?你说都是0? 不好意思!LOOKUP说,我认为他是升序,他就是升序的!)所以后面肯定有比这个大的!,所以他会一直往后“二分”,直到最后一个,判断是小于等于1的,所以返回最后一个!
这么说,你要是还看不懂,我真的救不了了!今天你学废了吗?