前文发完之后,有个有意思的网友说:简单表用VLOOKUP,INDEX+MATCH函数不支持排序!
看来这位新道友,对MACTH的用法有些不太熟悉啊,哪就必须安排一下,所以今天我就来聊聊这个INDEX+MATCH函数和VLOOKUP函数上用法有什么细微区别吧。
闲言少叙,切入正题,在比较之前,先来回忆一下,这两组函数的基本语法结构和参数的含义。
01语法结构和参数含义:
Vlookup语法结构:VLOOKUP(查找值,查找范围,列数,查找模式)
功能:通过搜索值在查找范围的行数,再根据列数参数和查找模式设置,返回对应的值;
查找值:指定查找的值或单元格,不过查找值必须以查找范围的最左列的值,否则返回#N/A!查找范围:通常为单元格区域,也可以是自定义名称意指的的引用范围,INDIRECT和OFFSET函数生成引用等。列数:是从查找范围最左侧的一列开始计数,起始值为1,向右依次累加,但列数不能大于查找范围总列数,则会返回#N/A;查找模式:支持两类:逻辑值和数值,FALSE/0为精准查找,TRUE/非零:为模糊查询,要求最左列要以升序排序,默认为TURE,可省略;INDEX+MATCH函数语法结构:
原型式:INDEX(引用范围,MATCH(查找值,行,查找模式),[MATCH(查找值,列,查找模式)])
功能:INDEX函数通过MATCH函数来获取行和列的信息,读取引用范围的对应的值;
引用范围:常见行和列或其中的一部分,当然也支持同时包含行列的引用范围MATCH查找值:指定单元格或已经定义名称,它所在的位置并无特殊要求;MATCH行/列:查找的范围比较固定,必须为单行,单行的一部分;或者是单列,单列的一部分;MATCH查找模式:为3个,0:精准查找,0和0是模糊查询,这里用简单1和-1代表;1:要求查询列或行排序为升序,省略时默认模式;-1:要求查询列或行为降序排列;这些就是VLOOKUP和INDEX和MATCH组合的参数说明,因为两者都支持精准和模糊查找两种模式,哪我就先从对比精准模式的用法开始吧。
02精准查找用法
不管是VLOOKUP,还是MATCH函数,当它们的末位参数都为0或FALSE时,就开启了精准查找模式,还是用一个实例,来细品一下它们之间哪细微的区别:
例1:现有一个班级的语文、数学、英语的成绩,要求做一个查询小工具,录入姓名,选择科目,就能查询出成绩?数据结构如下:
案例的数据结构示意图(图1)VLOOKUP用法分析:根据姓名查出他对应的某科成绩并不难,这是VLOOKUP的基本的用法,还是举例熟悉一下,回看源数据,要查询韩嵩的英语成绩,如查询范围是A1:F16,而英语成绩在引用范围的中第4列,公式通常会这么写:
=VLOOKUP(“韩嵩”,A1:F16,4,0),而题目要求变了,科目变成下拉菜单,成绩需要根据选择的科目显示,那么我们该如何处理呢?
其实这个问题并不难解决,不过就是将下拉菜单的科目转化成所在的列数,而能将单元格值转化为成位置的,我想就MATCH了吧,想到这,这个问题是不是就变成了VLOOKUP+MATCH嵌套问题了。
换句话说:就是之前手动录入的4,现在用MATCH函数查询的方式得到,不过这里需要注意,如果VLOOKUP的查找范围A1:F16,哪MATCH的查找范围就是A1:F1,在引用范围的宽度尽量保持一直,否则容易出现结果错误。
操作步骤:
1.J1:L1分别录入:姓名,科目,成绩;2.选中K2,点击下的按钮,弹出数据验证窗口,允许(A):选择序列,来源选择:=$C$1:$F$1,点确定;3.L2录入公式:=VLOOKUP(J2,A1:F16,MATCH(K2,A1:F1,0),0);
VLOOKUP函数操作示意图(图2)INDEX+MATCH用法分析:我们平常对应INDEX函数,可能更多是使用2个参数的情况,而且读取的引用范围通常也是以单列或行较多,比如同样读取韩嵩的英语成绩,通常我们会这么编写公式:
=INDEX(D1:D16,MTACH(“韩嵩”,A1:A16,0))但本例的科目是下拉菜单,不得不让我们将INDEX读取范围由单列引用扩展到二维引用上,即将原来的D1:D16,扩充到A1:F16,这样就需要多一个关于列数的定位,同样可是使用上面的MATCH(英语,A1:F1,0)解决,再调整一下公式:
=INDEX(A1:F16,MATCH(韩嵩,A1:A16,0),MATCH(英语,A1:F1,0)),最后将姓名和科目名称的引用位置代入公式即可;
具体操作,前2步同上,第3步L2录入公式变为:=INDEX(A1:F16,MATCH(J2,A1:A16,0),MATCH(K2,A1:F1,0),0);
INDEX+MATCH组合用法运行示意图(图3)通过上面的VLOOKUP函数公式,我们不管怎么调整1参,2参,4参,而结果始终在一水平线上,第3参更像水平线上的刻度,而返回的就是对应的刻度值,而INDEX+MATCH组合就没有这方面的局限,尤其INDEX+2个MATCH用法更能充分证明这一点,你可通过修改参数,读取INDEX引用范围的任意数据。说到这,是不是就有人要说:这不,INDEX+MATCH就完全可以替代VLOOKUP和HLOOKUP函数了啊!
有个真理说的好:存在即合理,两者并不存在谁要替代谁,而是哪个适合就用哪个:
同样功能的时候,VLOOKUP的公式比INDEX+MATCH组合更简洁一些,而INDEX+MATCH组合更佳灵活,没有特殊的条件限制,在使用时,就看你遇到什么情况了?适合谁就用谁,没有必要规定选哪个,除非你喜欢!
下面就轮到和精准查询模式相对的:
03模糊查找用法:
开启模糊查找的时候,两者在用法上会有所不同:
VLOOKUP模糊查找:对应的参数为非零和TRUE,这里要注意了,没有错,就是非零,有好多书中在介绍时,都限定了参数是1,那样写并不准确,即便你填写-也是能开启模糊查询的哦。
除了参数上的要求,还要求查询引用范围必须为升序排列,否则返回错误代码#N/A:;
MATCH的模糊模式:对应也是2个范围,0或0,却支持两类排序,0为升序,0为降序,不过他们两者有个共同点,就是当最后一参数省略时,开启升序模糊查找。
还是来个简单的例子,来看一下,两者在模糊模式用法不同吧。
现根据学生成绩的平均分为准,将成绩划分成5个级别:
60以下为E;=60且70,为D;=70且80,为C;=80且90,为B;=90为A;实现分级一般会用IF嵌套和VLOOKUP函数来实现,由于IF嵌套一多,逻辑结构变复杂,就被有的大公司限制为最多可用3层嵌套,那么多级划分就自然的落在VLOOKUP函数身上了;常见的操作步骤为:
1.创建init表,A1:B1录入:划分线,分级;2.在A2:A6:录入0,60,70,80,90;B2:B6:E,D,C,B,A;3.在Sheet1表G1录入等级,在G2录入公式=VLOOKUP(F2,init!A$1:B$6,2);4.鼠标移至G2的右下角,变为+时,双击完成公式填充。
vlookup处理多级划分步骤示意图(图4至于VLOOKUP的实现原理,之前在文章《替换IF函数的3类用法,你知道一切?这有原理,了解一下!》有详述,这里就不再赘述了。
其实INDEX和MATCH组合也能实现的,而且也不复杂,只需修改一下公式解可:
=INDEX(init!B1:B6,MATCH(F2,init!A$1:A$6));
原理同精准查找INDEX组合用法没有差别,只不过这次使用了模糊查找规则而已,不过MATCH还支持降序,也就说,你的init表格还可以做成降序的样子:
升序降序数据结构示意图(图5)只不过,将上面的公式稍作修改即可:=INDEX(init!B$1:B$6,MATCH(F2,initA$1:A$6,-1));
其实模糊查询的升序/降序的原理,都可总结成一句话:
升序:找到小于查询值的最大值,比如说65,小于65的有两个0和60,则返回60对应的行数或值;降序:找到大于查找值的最小值,比如75,而init大于70的有80,90,,则返回80对应行数或值这个例子中,我们不难发现INDEX+MATCH从功能上是完胜的VLOOKUP的,但为什么还是使用VLOOKUP的比较多的呢?在这个问题上,我也问过学生们不止一次,但更多的答案是“简单”二字,也许就是VLOOKUP在代码上比INDEX+MATCH组合上少了那么一丢丢,却赢得大部分人的偏爱,有了这个原则,是不是就不难理解为什么好多人不偏爱的VLOOKUP加IF实现逆向查询,这里除了性能方面的考虑,而更大一部分的原因可能就是index组合,用的更简单吧。
有的人可能说:可你每次写的文章都把问题搞得很复杂!确实,我的学生也总说,就一个简单的例子,你都可能要说4-5种方法,用得着这么复杂吗?我工作的时候也就仅用一种而已。
没错,确实工作中只能使用一种,如果要做到化繁为简就不容易,而好多人对化繁为简的理解有点偏差,不是上来就学表面的处理方法,处理技巧,使用某个新功能,而不去了解它的原理,否则就没有现在各种软件迭代和发展了,大家只会千篇一律的用老祖宗留下来的方法就好,还谈什么发展啊,这也是为什么在社会上,懂得原理的人,懂得底层的人,价值更高的原因,事情开始都是从简变繁,再从繁变简,只有经历这个过程,你才有可能超越之前的人,才有可能把事情的处理方式变的更简单。
我的老师曾经说过一句话,我印象非常深刻:如果你想尽快把一本书上的内容,变成自己的,需要经历3个过程,先薄,就是读目录,想象你认为的样子,再看到内容时,对比和自己的想法有什么出入,这时书变厚,等你通过实践,验证了,都明白了,也许这时书就又变成一页目录:再薄。
好了,今天内容就分享这么多,希望你从中有所收获,如果你喜欢,就