ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] [函数用法讨论系列10] LOOKUP的查找策略!

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2007-4-4 09:33 | 显示全部楼层
本帖已被收录到知识树中,索引项:LOOKUP
真的是好。谢谢分享。谢谢版主!!!下载了~~~~~~~~~~~

TA的精华主题

TA的得分主题

发表于 2007-5-11 22:03 | 显示全部楼层
QUOTE:
以下是引用gouweicao78在2006-4-15 11:57:08的发言:

另外,下一个议题:Looup()的第2参数含有空值和错误值情况时是怎么处理的呢?(注意:47楼的模拟器并未考虑这2点!)

备忘:大家比较认同的观点:“LOOKUP函数可以忽略错误,但数组必须以升序排列,说得更清楚些:如果是查找数值,数组中的数值元素要升序(不求在连续位置),文本元素随便;如果是查找文本,数组中的文本元素要升序,数值元素随便;除了返回错误的情况外,在一列中查找时,查找数值只返回数值,查找文本只返回文本。”——chenjun;“这里还要再说明一点的就是(LOOKUP()忽略错误值及空格(值).只查找第一个参数所对应数据类型)”——yigepure;见链接77楼、82楼

请大家再仔细推敲一下,或者错误值先不看,看看空值怎么个“忽略”法。


很高兴这一个“讨论帖”荣获了2个精华(8楼、47楼),尽管,这并不完美!为不愧对大家的厚爱,继续写下曾经中断的文字。

《Lookup二分法查找之“惑”起萧墙》

一年前,在经过与各位网友辩论,对Onkey的二分法流程图进行了纠错和论证模拟之后,原本以为应该是一个结尾,但很快我留了一个自己没有解答的议题,而后由于工作关系又搁置了很久,现在就拿出来再讨论。我自己论证的,却要自己论证它的另一面,这也算是“惑”起萧墙吧。

即:第2参数不是由单纯类型元素组成,Lookup如何“忽略”空值、错误值、和非第1参数类型值。

因为47模拟器针对第2参数是纯数字的情况进行了“乱序”查找的“二分法”原理论证,这是正确的。同理可以论证单纯的逻辑值、单纯的文本作为第2参数。

但是,诸如LOOKUP(1,0/(条件),查找区域),或者有空值、文本数值混和的情况下,用“二分法”不知道是怎么走的,如果是“忽略”又是怎样忽略的。希望有人再探讨一下。

[此贴子已经被作者于2007-5-12 0:45:27编辑过]

点评

fdd
留个记号,这些总结提示很不错!  发表于 2011-8-24 14:17

TA的精华主题

TA的得分主题

发表于 2007-5-11 22:14 | 显示全部楼层

最简单的想法是:

剔除了其他非第一参数类型的元素,而将第一参数类型的元素重组为一个新的数组,再对这个新数组采用二分法。

不但这样,所有的查找函数,不论是精确查找、模糊查找,都应该包含有这么一个“剔除”的过程。

但,它真的有这个过程吗?

TA的精华主题

TA的得分主题

发表于 2007-5-11 23:14 | 显示全部楼层
QUOTE:
以下是引用czzqb在2007-5-11 22:14:23的发言:

最简单的想法是:

剔除了其他非第一参数类型的元素,而将第一参数类型的元素重组为一个新的数组,再对这个新数组采用二分法。

不但这样,所有的查找函数,不论是精确查找、模糊查找,都应该包含有这么一个“剔除”的过程。

但,它真的有这个过程吗?

第一个探索方向:数据剔除和重组。——失败?

这个我已想过并测试,我对此的模拟结果并非如此简单的重组。感觉好不容易论证了它的成立,现在因为这一点说不过去,实在……[em06],请看:

lpSPUuSX.zip (4.54 KB, 下载次数: 288)
[此贴子已经被作者于2007-5-11 23:38:13编辑过]

TA的精华主题

TA的得分主题

发表于 2007-5-11 23:23 | 显示全部楼层

我的另一个试探方向:排序。——失败?

Excle帮助文件

 

默认排序次序 (Excel2003版,2007版帮助文件内容大同小异,在数字和按字母先后顺序排序之间增加了日期,个人觉得容易造成误解,因为日期是数值的一种特殊格式,目前的日期就是30000多的一个值而已)

在按升序排序时,Microsoft Excel 使用如下次序(在按降序排序时,除了空白单元格总是在最后外,其他的排序次序反转):

数字      数字从最小的负数到最大的正数进行排序(从理解上来说,我更愿意称之为数值)。

按字母先后顺序排序      在按字母先后顺序对文本项进行排序时,Excel 从左到右一个字符一个字符地进行排序。例如,如果一个单元格中含有文本“A100”,则这个单元格将排在含有“A1”的单元格的后面,含有“A11”的单元格的前面。

文本以及包含数字的文本(如Char(48)得到的是文本,而不是数值),按下列次序排序:

0 1 2 3 4 5 6 7 8 9 (空格) ! " # $ % & ( ) * , . / : ; ? @ [ \ ] ^ _ ` { | } ~ + < = > A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

撇号 (') 和连字符 (-) 会被忽略。但例外情况是:如果两个文本字符串除了连字符不同外其余都相同,则带连字符的文本排在后面。

逻辑值      在逻辑值中,FALSE 排在 TRUE 之前。

错误值      所有错误值的优先级相同。

空格      空格始终排在最后。

简要归纳以上排序为:数值、文本、逻辑值、错误值、空单元格。

猜测:那么Lookup是否按这个顺序来走二分法呢,很显然也是不对的。比如在A1:A10的A5中放一个文本,其它放数值,按这个“升序规则理论”的话,文本排序在后面,是的大于数值的值,因此Lookup(数值,A1:A10)只能返回A1:A4这半区的值——这个推论肯定是错误的

[此贴子已经被作者于2007-5-12 1:56:00编辑过]

点评

fdd
这个也不错!  发表于 2011-8-24 14:18

TA的精华主题

TA的得分主题

发表于 2007-5-11 23:43 | 显示全部楼层

《无望的回归》

至今这个“忽略”异型数据的说法让“二分法”的推论难以完美。从上面两楼的摸索中,都没有得到正确的解答。

1、在数据库结构理论方面称为“二叉树”查找,其理论基础是“数据必须是有序的,对于存在重复的元素,它们必然是相邻的”。

对一个不是无序的数据进行二叉查找是没有意义的,对不同类型值进行大小比较也是无意义的,至少在算法上是如此。(比如说文字“我”大于数字10000,仅仅是作为Excel基础操作的“排序”用,在比较大小根本就没有意义,这个在思维逻辑上是众所周知的)

3、虽然,8楼、47楼的流程图及验证都已清楚地展示了Lookup在单纯类型数据中“乱序”查找所采用的“二分法”的推论,但,这仅仅是推论,是一个大多数人跟着认为比较可靠的想法,微软没有任何官方向我们透露这一点,也没有人获知Lookup的源代码来证实这一点。

4、即便,我们已经论证了第2参数不包含异型数据,Lookup准确的执行了二分法,得到了“二分法”的一个准确的答案,称之为查找结果,这个结果不是查找值(第1参数)对应的位置,称之为意愿结果。这是许多函数初学者常常问的为何Lookup找错的问题,也是他们会更容易接受VLookup的原因。

《微软的微笑》
翻开微软给我们的——Lookup函数帮助。

QUOTE:
要点  Lookup_vector 的数值必须按升序排序……否则,……不能返回正确的结果。
说明
如果函数 LOOKUP 找不到 lookup_value,则查找 lookup_vector 中小于或等于 lookup_value 的最大数值
如果 lookup_value 小于 lookup_vector 中的最小值,函数 LOOKUP 返回错误值 #N/A。


想必,这段话大家都已经在探索的过程中读过了N遍。我再带大家读一遍。

1、结合“对不同类型数据进行比较也是无意义的”,从这一点上来说LOOKUP真的是“忽略”与第1参数相异类型的值,不忽略的话也没什么意义,所以,第1参数为文本,则只要第2参数内的文本升序排列即可返回正确的意愿结果,数值乱序无碍;第1参数为数值,则只要第2参数内的数值升序排列即可返回正确的意愿结果,文本乱序无碍。——“帮助文件给你排序标准只是把它们写在一起而已,你们自己猜的”微软微笑不语。

2、说明(1)返回小于等于第1参数的最大数值结合要点的排序标准:数值升序,那么如果第1参数比第2参数都大(注意,这里的“比”已经不比较无意义的异型值了),则第2参数能够的上最大的也就是在最后位置了,这已经可以解释LOOKUP(9E+307,A:A)返回A列最后一个数值以及LOOKUP(1,0/(条件),查找区域)返回最后一条满足条件的记录。因为按默认升序原则,最大的肯定在最后面(尽管最后一个数值往往不是A列最大值,但Lookup就认这个死理儿),是否二分法,是怎样的二分法,微软微笑不语。

沸沸扬扬,熙熙攘攘。

Onkey念动了Lookup神秘的咒语,纷涌而至的的人们,在不经意间把我挤到这瓶尘封已久的茅台,瓶子碎了,酒香飘了,人醉了……(Music

醒来,耳畔响起刀郎沧桑的《德令哈一夜》,似乎印证了我此时的感受“始终无法清晰的记起昨夜谁入梦(ps:被弄迷糊了),毕竟心里也不敢轻易去碰刚愈合的痛(ps:好不容易才论证了二分法,却要论证另一面),你再忍一忍,你再等一等(ps:……)”

难道就此放弃?还是……秉承Lookup这个认死理儿的脾气,终将继续探索到底

[此贴子已经被作者于2007-5-14 19:15:06编辑过]

TA的精华主题

TA的得分主题

发表于 2007-5-12 02:39 | 显示全部楼层

先记下草兄的成果:

在按升序排序时,Microsoft Excel 使用如下次序: 数值、文本、逻辑值、错误值、空单元格。

(在按降序排序时,除了空白单元格总是在最后外,其他的排序次序反转)

数字      数字从最小的负数到最大的正数进行排序(从理解上来说,我更愿意称之为数值)。

按字母先后顺序排序      在按字母先后顺序对文本项进行排序时,Excel 从左到右一个字符一个字符地进行排序。例如,如果一个单元格中含有文本“A100”,则这个单元格将排在含有“A1”的单元格的后面,含有“A11”的单元格的前面。

文本以及包含数字的文本(如Char(48)得到的是文本,而不是数值),按下列次序排序:

0 1 2 3 4 5 6 7 8 9 (空格) ! " # $ % & ( ) * , . / : ; ? @ [ \ ] ^ _ ` { | } ~ + < = > A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

撇号 (') 和连字符 (-) 会被忽略。但例外情况是:如果两个文本字符串除了连字符不同外其余都相同,则带连字符的文本排在后面。

逻辑值      在逻辑值中,FALSE 排在 TRUE 之前。

错误值      所有错误值的优先级相同。

空格      空格始终排在最后。

[此贴子已经被作者于2007-5-16 20:56:40编辑过]

TA的精华主题

TA的得分主题

发表于 2007-5-12 09:10 | 显示全部楼层

楼上各位大侠的思路有新意,但按这一想法,其数组参数还是需升序的,起码踢除“杂质”以后的数组是升序的。

[此贴子已经被作者于2007-5-12 10:02:48编辑过]

TA的精华主题

TA的得分主题

发表于 2007-5-13 00:30 | 显示全部楼层
<div class="msgheader">QUOTE:</div><div class="msgborder">流程图已更新-willin2000 2007 5/16</div><p>经过一些摸索,基本看法是LOOKUP在含非第一参数类型查找时还是按二分法进行,只是原来的流程图里面少了一些判断.</p><p>我认为可能的流程是这样的,虽然想尽可能穷尽所有状况,但是我也只是模拟了和自己目前能想到的情景,抛砖引玉,请大家指针:</p><p> IzZluvYJ.zip (16.05 KB, 下载次数: 144) <br/><br/></p>
[此贴子已经被作者于2007-5-16 21:35:38编辑过]


[ 本帖最后由 willin2000 于 2008-11-18 21:34 编辑 ]
M6Z29yEE.jpg

TA的精华主题

TA的得分主题

发表于 2007-5-13 09:17 | 显示全部楼层

:如果把新增流程放到右边,也是能走得通的。

 


您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-7 00:41 , Processed in 0.035711 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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