楼主 opelwang |
VLOOKUP 函数是查找数据中是使用最广泛的一个函数,现将其基本用法,进阶学习,高级使用整理一下。 供新手学习使用。 vlookup函数详解22.rar |
2楼 opelwang |
针对VLOOKUP函数中第四个参数:1不能省略,0才可以省略,但返回的不是精确值,而是匹配值. 但教材中有一个1和-1参数,相信大家很少用了吧,这里作个简单的说明: 1.当要查找的值列有两个或以上对应的数值时,按升序排列,1作为第四个参数,取最大值,如图: 2.当要查找的值列有两个或以上对应的数值时,按降序排列,-1作为第四个参数,取最小值,如图: 我是在实践中偶然一次发现通过排序能取最大或最小值的特点,现与大家分享. 如有疑问,欢迎跟贴讨论! |
3楼 gouweicao78 |
【更正】:一般来说,省略是指第4参数连同其前面的逗号都不写的情况,比如:VLOOKUP(C1,A:B,2)就是VLOOKUP(C1,A:B,2,1)的省略写法。 因此,1是可以省略的,而0则不可以省略,只能简写:VLOOKUP(C1,A:B,2,)就是VLOOKUP(C1,A:B,2,0)的简写方法。 例子中用了较多shangyu版主原有的东西,不过,有一个创新很不错:-1的用法 。 我也曾说过shangyu的VLOOKUP入门确实很经典,很难超越。 |
4楼 opelwang |
感谢gouweicao78 -1与1的用法是在实践中得来的,其实这个函数教程确实是用了部分他人的例子,不过目的不在此. 目的在于是将这个函数的用法与精髓整理到一起,供新手学习,高手在一起相互讨论. 请大家不要误解. |
5楼 breezy |
做得不错,不过<实例>表中好像有一个EH的图片LOGO哦,建议去掉. |
6楼 opelwang |
感谢提醒,已经去掉.在一楼更新. |
7楼 gouweicao78 |
不好意思,要再次更正了: -1的用法,并非opel-wong兄所言的那样。呵呵。 |
8楼 opelwang |
愿闻其详,可否上传个实例来证明. |
9楼 apolloh |
关于-1和1的说法应该只是个特例,可以用下面这组数据测试一下,查找B对应的值 B 45 B 543 C 345 D 3534 B 4534 E 4 |
10楼 opelwang |
关于-1作为最后一个参数,排序后返回最小值已经被gouweicao78 版主推翻,不成立. 给大家造成的困扰,在这里说声抱歉! 关于1作为最后一个参数,排序后返回最大值,我个人测试成立.如附件,请大家给予测试.谢谢! Book1.rar |
11楼 apolloh |
1的说法,也不成立。请测试下面的数据。不过你的钻研精神值得鼓励。继续努力! B 45 B 3453453 C 345 D 3534 B 55 E 4 建议读一下草版的lookup的查找策略,也许会有些启发。 |
12楼 gouweicao78 |
更正一下Apolloh的说法,呵呵 :Lookup的查找策略是onkey先写的,对于Lookup的“二分法”查找策略的论证、更正及模拟器才是我写的,之后Willin2000兄又进一步完善了流程图。 对opel-wong兄: 首先,肯定您对函数用法的钻研精神,以及此帖对于更多人员理解VLOOKUP第4参数的借鉴作用,建议加技能分。 其次,对于VLOOKUP的第4参数: 1、VLOOKUP第4参数省略或者为1、TRUE(即近似匹配用法),此函数与LOOKUP的查找策略与LOOKUP相同。 1、根据函数的帮助,本身近似匹配用法要求第2参数table-arry(即被查的数据表)的首列必须升序,否则不能返回正确的数值。原文如下:
2、对于其首列不是升序的情况,其实近似匹配用法本身就已没有使用的价值。但作为函数原理的深层次探讨,不管其首列是否升序,近似匹配用法都是遵循“二分法”的,根本不管第2列(或VLOOKUP第3参数指定的列)是否排序。 opel-wong兄所提供的2种情况的示例,均是“首列升序”的情况,适用下面这个原则(帮助文件原文)
也就是说——生产部、销售部不管多少个,只要升序排列后(生产部<销售部),例子中的lookup_value即VLOOKUP第1参数是“生产部”——A列升序排列后,小于等于lookup_value的最大值也就是最后一个“生产部”所在位置。 因此,B列也升序的话,则最后一个就是你说的“最大值”,降序就是“最小值”,你再试试看B列的数值乱序排列呢,是不是还总返回最后一个“生产部”的值?呵呵! 如果A列不升序排列,比如稍稍打乱一下,生产部仍然放在一起,但A列已经不是升序排列,如图: 此时,就不一定能返回最后一个“生产部”对应的记录了,而是遵循“二分法”的原理。 【结论】VLOOKUP函数第4参数,为0、FALSE或简写剩下逗号则精确匹配,返回第一个满足条件的记录,无满足条件者,返回#N/A错误; 为TRUE或非0数值(常用1,也可以用-1,等)或完全省略,则近似匹配,返回结果是根据“二分法”原理运算的。 【参考】关于二分法,可参考: [原创]Lookup函数二分法模拟器 |
13楼 林夕瑜 |
呵呵,学习了 |
14楼 opelwang |
受教了!非常感谢gouweicao78 版主的指正! 看来还需要继续努力,钻研学习。 希望此贴给我带来收益的同时,也让更多人受到启发! |
15楼 opelwang |
已经更正了一楼的附件。 |
16楼 ljx63426 |
这个涵数好实用,但运用中还是不太会用,呵呵!! |
17楼 LYG1868lyg |
哈哈,学习了! |
18楼 windowsxpsp |
下载下来, 有些不理解,但照搬倒是用上了 |
19楼 wuni_cn |
急用这贴,感谢版主,辛苦了 |
20楼 lrlxxqxa |
很不错的过程,即使错了也都是有价值的,感谢各位! |
21楼 xyh9999 |
我觉得应该在教程中增加一个说明Table_array 参数可以是数组的例子,比如: =VLOOKUP("星期五",{"星期一",1;"星期二",2;"星期三",3;"星期四",4;"星期五",5;"星期六",6;"星期日",7;"星期天",7},2,FALSE) 可以返回5 不然大家还以为就只能引用表格中的范围呐. |
22楼 chunqueyiyi |
嗯,不错蛮好东西。 |
23楼 cartor |
vlookup的1和-1在实际中确实用得很少,今天长见识学习了! |
24楼 胜利路动迁 |
请教:在一个excel里,有一列身份证号码,如果我新建另一个excel,里边同样有一列身份证号码,但新建的这列excel表里有许多身份证号码和第一列excel里的身份证号码相同,如何对这两个excel进行比较,把多出来的这些身份证号找出来?让表格只显示多出来的这些身份证号码。谢谢** |
25楼 normdist |
提供一个思路,你可以照自己要求改进: 假设原始序列号码是1234,5678,9101,7685(在A1:A4列),新序列号码是1234,5679,9101(在C1:到C3列)。 选择一个三行一列空白范围,输入=isna(match(C1:C3,A1:A4,0))*1,然后Ctrl+Shift+Enter,输出一个三行一列的0-1数列,其中1元素对应和原始序列不相同的号码。 |
26楼 小宣诳诳 |
谢谢。分享 |