ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 23084|回复: 29

[原创] 深入理解LOOKUP:LOOKUP函数的查找原理

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2016-2-13 23:38 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 龙逸凡 于 2016-2-15 13:03 编辑

深入理解LOOKUP:LOOKUP函数的查找原理
一只小猴,坐在一堆按从小到大排好顺序的包谷前,想拿一根最大的包谷,但小手又太小了,比手大的包谷拿不了,怎么才能用最快的方法找到拿得下的最大的包谷呢?




Lookup 0.JPG


Excel对LOOKUP函数的帮助写了这么一句话: “查找区域”中的值如果不按升序排列,LOOKUP函数可能无法返回正确的值。我们使用LOOKUP数据按升序的时候少,乱序的情况用得更多。所以,必须得弄清楚什么情况下无法准确地返回查找值?如果不弄清楚,公式结果是怎么错的都不知道,后患无穷。要弄清楚,就必须得弄清楚查找原理。


一、   LOOKUP函数基本知识
语法:
LOOKUP(查找值,查找区域,结果区域)
示例:=LOOKUP("龙逸凡",A2:A7,B2:B7)
要点:
1、 “查找区域”中的值必须按升序排列:..., -2, -1, 0, 1, 2, ..., A-Z, FALSE, TRUE;否则,LOOKUP 可能无法返回正确的值。 文本不区分大小写。
2、 如果 LOOKUP 函数找不到“查找值”,则该函数会与“查找区域”中小于或等于“查找值”的最大值进行匹配(注:在满足要点1“数据升序排列”的前提下)。
3、 Excel帮助文件上要求:“查找区域”与“结果区域”大小必须相同,实际上可以不必相同。
LOOKUP第三参数如果为一个单元格(比如输入B2或B2:B2),则取值范围默认为横向,等同于B2:H2、B2:M2等。
如果第三参数是包含二个单元格以上的纵向单元格区域,则单元格范围大小不影响公式的计算。比如下面的公式是等效的
=LOOKUP("龙逸凡",A2:A7,B2:B3)
=LOOKUP("龙逸凡",A2:A7,B2:B7)
=LOOKUP("龙逸凡",A2:A7,B2:B65535)
有点类似于SUMIF第三参数(SUMIF第三参数真正起作用的是第三参数单元格区域左上角那个单元格,起到坐标定位的作用,详见本人写的《深入理解SUMIF:如何多表多列多条件求和?》

二、   LOOKUP函数的查找原理
查找原理和要点可总结为四条:
1、LOOKUP函数要求“查找区域”中的值必须按升序排列。如果“查找区域”没有按升序排列,Lookup函数也会很傻很天真地认为你是个按规则办事的人,已将数据按升序排列。
注意:这一点对理解LOOKUP函数的查找逻辑非常重要。
2、由于“查找区域”已按要求按升序排列,为了提高查找效率,LOOKUP都是按二分法查找。具体的查找方式:
假设要查找的值为X,将X与已升序排列的“查找区域”最中间位置的那个数(我们称之为“位中值”)进行比较:
  • 若X等于或大于“位中值”,由于已按升序排列,前半段的数肯定比位中值更小,所以就在“查找区域”的后半段中,继续按二分法进行查找。
  • 若X小于“位中值”,由于已按升序排列,后半段的数肯定比位中值更大,所以就在“查找区域”的前半段中,继续按二分法进行查找。

确定中间位置的计算方式:个数为奇数时取最中间那个,为偶然个时并列最中间的那两个数的左边那个。
3、 如果 LOOKUP 找不到与“查找值”相等的数,它会使用“查找区域”中小于或等于 “查找值”的最大值。
要注意的是:
“查找区域”乱序的时候,并不一定会返回小于或等于的最大值,而是一直按二分法进行查找,直到查找到相等的数或按规则查找完应该完应该查找的位置(不是查找完所有的值),如果还找不到相等的数,就返回结束查找前最近一个符合条件的值。如果有多个符合条件,则返回最后一个符合条件的值。
4、LOOKUP在查找区域中的遇到空值和错误值时,会忽略空值和错误值,继续在后半段进行二分法查找。

下面举例解释一下LOOKUP的查找原理。
我们要在A2:K2单元格区域查找9,并返回A3:K3区域对应的值,公式计算结果为8。
lookup 1.png

lookup 1.5.png
如果将H2单元格8.1改为小于等于9的任何数,比如2,接前面步骤三:公式均返回A3:K3对应的值8。
如果将H2单元格8.1改为大于9的任何数,比如100,接前面步骤三:由于100〉9,不符合条件,则公式返回上一个符合条件的7.1所对应的值7。
如果查找值是8,H2仍为8.1,则8.1>8,不符合条件,所以就返回符合条件的最后一条值7.1所对应的7。
为了帮助理解,多举几个例子,大家按照上面的方法一步步进行二分法查找,琢磨一下查找原理。
lookup 2.png
lookup 3.png

大家还可参考方骥版主的帖子,
http://club.excelhome.net/thread-872105-1-1.html
本文也是在方版文章的基础上进行进一步的细化讲解,在此向方版表示感谢!!

本文附件下载:
深入理解Lookup函数.rar (12.91 KB, 下载次数: 607)

评分

6

查看全部评分

TA的精华主题

TA的得分主题

发表于 2016-2-14 00:37 | 显示全部楼层
感谢楼主的分享,辛苦了!

TA的精华主题

TA的得分主题

发表于 2016-2-14 12:29 | 显示全部楼层
感谢楼主的分享!
1、补充:楼主阐述的是LOOKUP“向量用法”,不牵扯LOOKUP“数组用法”。
2、本人最大收获:““查找区域”与“结果区域”大小必须相同,实际上可以不必相同”。两个区域的方向可以不同,但必须是单行或单列;单个单元格的“结果区域”起到“定位”的作用,并默认横向与“查找区域”尺寸相同。
3、本人感受:不限于LOOKUP函数,凡涉及“模糊查找”,都是采用二分法算法。一般地,当目标向量(查找区域)中的值是升序排列时,可以得到“满意”的结果,当目标向量中的值不是升序排列时,则得不到“满意”的结果。除特殊情况(如MATCH函数中的“-1”模糊查找方式)外,一般查找函数都要求“升序排序”,且查找的是“不大于查找值的最大值”。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2016-2-14 20:39 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2016-2-14 21:40 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2016-2-14 23:20 | 显示全部楼层
本帖最后由 首席打杂 于 2016-2-14 23:22 编辑

我个人觉得所谓理解二分法对于使用这个函数的意义真不大,二分法只能很好的解释当你用错lookup时的结果。

但你如果要用对:
1、要么你按函数说明确保是排序的;正常用法 lookup(3,{1,2,3,4},……)
2、要么你确保是只有1个符合的;lookup(,0/(0,1,0,0,0),……)
3、要么你确保是一定找不到的大数;lookup(2,{0,#na,#na,0,#na,#na,1,#na,0},……)

评分

6

查看全部评分

TA的精华主题

TA的得分主题

发表于 2016-2-15 08:31 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-2-15 13:06 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
首席打杂 发表于 2016-2-14 23:20
我个人觉得所谓理解二分法对于使用这个函数的意义真不大,二分法只能很好的解释当你用错lookup时的结果。
...

是的,弄清查找原理,遇到问题时就知道错在哪

TA的精华主题

TA的得分主题

发表于 2016-2-16 14:19 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
很有帮助,认真学习中

TA的精华主题

TA的得分主题

发表于 2016-3-4 10:31 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
我是生生世世,来支持一个
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-10 20:46 , Processed in 0.045818 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表