Table of contents
本教程展示了如何在Excel中使用INDEX和MATCH,以及它如何比VLOOKUP更好。
在最近的几篇文章中,我们努力向初学者解释了VLOOKUP函数的基础知识,并向高级用户提供了更复杂的VLOOKUP公式实例。 现在,我将尝试即使不劝你放弃使用VLOOKUP,至少也要向你展示在Excel中做垂直查询的另一种方法。
"我需要这个干什么?"你可能会问。 因为VLOOKUP有许多限制,在许多情况下会妨碍你得到想要的结果。 另一方面,INDEX MATCH组合更灵活,有许多令人敬畏的功能,使它在许多方面优于VLOOKUP。
Excel的INDEX和MATCH函数--基础知识
由于本教程的目的是演示在Excel中使用INDEX和MATCH函数组合进行Vlookup的另一种方法,因此我们不会过多地讨论它们的语法和用途。 我们将只涉及理解总体思路所需的最低限度,然后深入研究公式实例,揭示使用INDEX MATCH代替VLOOKUP的所有优点。
INDEX函数 - 语法和用法
Excel的INDEX函数根据你指定的行号和列号返回数组中的一个值。 INDEX函数的语法很简单。
INDEX(array, row_num, [column_num])下面是对每个参数的一个非常简单的解释。
- 阵列 - 一个你想返回一个值的单元格范围。
- 行数_num - 数组中想要返回数值的行号。 如果省略,则需要列号。
- 列_num - 数组中想要返回数值的列号。 如果省略,则需要使用row_num。
更多信息,请参见Excel INDEX函数。
下面是一个最简单形式的INDEX公式的例子。
=index(a1:c10,2,3)
该公式在A1至C10单元格中搜索,并返回第2行第3列的单元格值,即C2单元格。
非常简单,对吗? 然而,在处理真实数据时,你几乎不知道你想要哪一行哪一列,这时MATCH函数就派上用场了。
MATCH函数 - 语法和用法
Excel的MATCH函数在一个单元格范围内搜索一个查找值并返回 相对位置 的范围内的该值。
MATCH函数的语法如下。
MATCH(lookup_value, lookup_array, [match_type])- 查找_值 - 你要找的数字或文本值。
- lookup_array - 被搜索的单元格的范围。
- 匹配类型 - 指定是否返回精确匹配或最接近的匹配。
- 1或省略 - 找到小于或等于查找值的最大值。 需要将查找数组按升序排序。
- 0 - 找到第一个与查找值完全相等的值。 在INDEX/MATCH组合中,你几乎总是需要一个完全匹配的,所以你将MATCH函数的第三个参数设置为0。
- -1 - 找到大于或等于lookup_value的最小值。 需要对lookup数组按降序排序。
例如,如果范围B1:B3包含 "纽约"、"巴黎"、"伦敦 "的值,下面的公式会返回数字3,因为 "伦敦 "是该范围的第三个条目。
=MATCH("伦敦",B1:B3,0)
更多信息,请参见Excel MATCH函数。
乍一看,MATCH函数的用处似乎值得怀疑。 谁会关心一个值在一个范围内的位置呢? 我们想知道的是这个值本身。
让我提醒你,查询值的相对位置(即行号和列号)正是你需要提供给 行数_num 和 列_num 正如你所记得的,Excel INDEX可以找到某一行和某一列交界处的数值,但它不能确定你到底想要哪一行和哪一列。
如何在Excel中使用INDEX MATCH函数
现在你知道了基础知识,我相信已经开始明白MATCH和INDEX是如何一起工作的了。 简而言之,INDEX通过列和行的数字找到查询值,而MATCH提供这些数字。 就是这样!
对于垂直查找,你只使用MATCH函数来确定行号,并直接向INDEX提供列的范围。
INDEX ( 列中返回一个值,从 , MATCH ( 查询值 , 抬头仰望的栏目 , 0))还在为这个问题犯难吗? 从一个例子中可能更容易理解。 假设你有一个国家首都及其人口的列表。
要找到某个首都的人口,例如日本的首都,使用以下INDEX MATCH公式。
=INDEX(C2:C10, MATCH("Japan", A2:A10, 0))
现在,让我们来分析一下这个公式的每一个组成部分的实际作用。
- MATCH函数在A2:A10范围内搜索查找值 "日本",并返回数字3,因为 "日本 "在查找数组中排名第三。
- 行号直接转到 行数_num 的参数,指示它从该行返回一个值。
因此,上述公式变成了一个简单的INDEX(C2:C,3),即在C2到C10单元格中进行搜索,并从该区域的第3个单元格中提取数值,即C4,因为我们从第二行开始计算。
不想在公式中硬编码城市吗? 在某个单元格中输入它,例如F1,向MATCH提供单元格引用,你将得到一个动态查找公式。
=index(c2:c10, match(f1,a2:a10,0))
重要提示! 中的行数。 阵列 INDEX的参数应该与在该数据库中的行数一致。 lookup_array 的参数,否则该公式将产生一个不正确的结果。
等等,等等......为什么我们不简单地使用下面的Vlookup公式呢? 浪费时间去弄清Excel MATCH INDEX的神秘曲折有什么意义呢?
=vlookup(f1, a2:c10, 3, false)
在这种情况下,根本没有意义 :) 这个简单的例子只是为了演示,让你感觉到INDEX和MATCH函数是如何一起工作的。 下面的其他例子将向你展示这种组合的真正力量,当VLOOKUP出现问题时,它可以轻松应对许多复杂的场景。
提示。
- 在Excel 365和Excel 2021中,你可以使用一个更现代的INDEX XMATCH公式。
- 对于谷歌表,请看本文中使用INDEX MATCH的公式例子。
INDEX MATCH vs. VLOOKUP
在决定使用哪个函数进行垂直查找时,大多数Excel大师都认为INDEX MATCH比VLOOKUP好得多。 然而,许多人仍然坚持使用VLOOKUP,首先是因为它比较简单,其次是因为他们没有完全理解在Excel中使用INDEX MATCH公式的所有好处。 没有这样的理解,就不会有人愿意投入时间去学习更复杂的语法。
下面,我将指出MATCH INDEX相对于VLOOKUP的主要优势,由你决定它是否值得加入你的Excel武器库。
使用INDEX MATCH而不是VLOOKUP的4个主要原因
- 从右到左的查询。 任何受过教育的用户都知道,VLOOKUP不能向左查找,这意味着你的查找值应该总是在表格的最左边一列。 INDEX MATCH可以轻松地进行左查找!下面的例子显示了它的作用:如何在Excel中向左查找一个值。
- 安全地插入或删除列。 当一个新的列被删除或添加到查询表中时,VLOOKUP公式会被破坏或提供不正确的结果,因为VLOOKUP的语法要求指定你想提取数据的列的索引号。 自然,当你添加或删除列时,索引号会改变。
使用INDEX MATCH,你指定返回的列范围,而不是索引号。 因此,你可以自由地插入和删除任何你想要的列,而不必担心更新每个相关的公式。
- 对查询值的大小没有限制。 当使用VLOOKUP函数时,你的查找条件的总长度不能超过255个字符,否则你将最终出现#VALUE!错误。 因此,如果你的数据集包含长字符串,INDEX MATCH是唯一可行的解决方案。
- 更高的处理速度。 如果你的表格相对较小,那么在Excel的性能上几乎不会有任何明显的差别。 但是如果你的工作表包含成百上千的行,并因此包含成百上千的公式,那么MATCH INDEX的工作速度将比VLOOKUP快得多,因为Excel只需要处理查找和返回列,而不是整个表格阵列。
如果你的工作簿包含复杂的数组公式,如VLOOKUP和SUM,那么VLOOKUP对Excel性能的影响可能会特别明显。 关键是,检查数组中的每个值都需要单独调用VLOOKUP函数。 因此,你的数组包含的值越多,工作簿中的数组公式越多,Excel的执行速度越慢。
Excel INDEX MATCH - 公式实例
知道了学习MATCH INDEX函数的原因,让我们进入最有趣的部分,看看如何在实践中应用理论知识。
INDEX MATCH公式,从右到左向上看
如前所述,VLOOKUP不能查看它的左边。 因此,除非你的查找值是最左边的一列,否则Vlookup公式没有机会给你带来你想要的结果。 Excel中的INDEX MATCH函数更加通用,并不真正关心查找和返回列的位置。
在这个例子中,我们将在样本表的左边添加等级栏,并试图找出俄罗斯首都莫斯科在人口方面的排名。
用G1中的查询值,用下面的公式在C2:C10中查询,并从A2:A10中返回一个相应的值。
=index(a2:a10,match(g1,c2:c10,0))
提示:如果你打算对一个以上的单元格使用INDEX MATCH公式,一定要用绝对的单元格引用来锁定这两个范围(比如$A$2:$A$10和$C$2:4C$10),这样在复制公式的时候它们就不会被扭曲。
匹配 INDEX MATCH MATCH在行和列中搜索
在上面的例子中,我们使用INDEX MATCH作为经典VLOOKUP的替代,从预定义的单列范围中返回一个值。 但是,如果你需要在多行和多列中进行查询呢? 换句话说,如果你想执行所谓的 基体 或 双向 查询?
这听起来很棘手,但该公式与基本的Excel INDEX MATCH函数非常相似,只有一个区别。 你猜怎么着?
简单地说,使用两个MATCH函数--一个获得行号,另一个获得列号。 我祝贺那些猜对的人 :)
INDEX (array, MATCH ( vlookup值 , 抬头仰望的栏目 , 0), MATCH ( hlookup值 , 抬头仰望的行 , 0))现在,请看下表,让我们建立一个INDEX MATCH MATCH公式,以找到某个国家在某年的人口(以百万计)。
目标国家在G1(vlookup值),目标年份在G2(hlookup值),公式是这样的。
=index(b2:d11, match(g1,a2:a11,0), match(g2,b1:d1,0))
这个公式如何运作
每当你需要理解一个复杂的Excel公式时,就把它分解成更小的部分,看看每个单独的函数是做什么的。
match(g1,a2:a11,0)
- 在A2:A11中搜索单元格G1("中国")的值,并返回其位置,即2。
match(g2,b1:d1,0))
- 通过B1:D1搜索,得到G2单元格("2015")中的数值位置,即3。
上面的行号和列号都是INDEX函数的相应参数。
index(b2:d11, 2, 3)
结果,你在B2:D11范围内的第2行和第3列的交叉点得到一个值,这就是D3单元格中的值。 简单吗?
Excel INDEX MATCH查询多个标准
如果你有机会阅读我们的Excel VLOOKUP教程,你可能已经测试了一个带有多个标准的Vlookup公式。 然而,这种方法的一个重要限制是必须添加一个辅助列。 好消息是,Excel的INDEX MATCH函数也可以用两个或多个标准进行查询,而无需修改或重组你的源数据!
下面是有多个标准的通用INDEX MATCH公式。
{=INDEX( 返回范围 , MATCH(1, ( 标准1 范围1 ) * ( 标准2 范围2 ), 0))}注意:这是一个数组公式,必须用Ctrl + Shift + Enter快捷键完成。
在下面的示例表格中,假设你想根据2个标准来查找金额。 客户 和 产品 .
下面的INDEX MATCH公式很有效。
=index(c2:c10, match(1, (f1=a2:a10) * (f2=b2:b10), 0)
其中C2:C10是要返回一个值的范围,F1是标准1,A2:A10是要与标准1比较的范围,F2是标准2,B2:B10是要与标准2比较的范围。
记得按Ctrl + Shift + Enter正确输入公式,Excel会自动用大括号括起来,如屏幕截图所示。
如果你不想在工作表中使用数组公式,可以在公式中再添加一个INDEX函数,然后用通常的回车键来完成它。
这些公式是如何工作的
这些公式使用了与基本的INDEX MATCH函数相同的方法,即通过单列进行查找。 为了评估多个标准,你创建了两个或多个TRUE和FALSE值的数组,代表每个单独标准的匹配和非匹配,然后将这些数组的相应元素相乘。 乘法操作将TRUE和FALSE转换为1和0。检索值为1的MATCH函数找到数组中的第一个 "1",并将其位置传递给INDEX,INDEX从指定的列中返回该行的一个值。
非数组公式依赖于INDEX函数原生处理数组的能力。 第二个INDEX被配置为0 行数_num 这样它就会把整个列数组传递给MATCH。
这是对该公式逻辑的高层次解释。 有关完整的细节,请参见Excel INDEX MATCH与多条件。
Excel中带有AVERAGE、MAX、MIN的INDEX MATCH
Microsoft Excel有专门的函数来查找一个区域中的最小值、最大值和平均值。 但如果你需要从另一个单元格中获取与这些值相关的数值,该怎么办呢? 在这种情况下,将MAX、MIN或AVERAGE函数与INDEX MATCH一起使用。
带有MAX的索引匹配(INDEX MATCH)。
要找到D列的最大值,并从同一行的C列返回一个值,使用这个公式。
=index(c2:c10, match(max(d2:d10), d2:d10, 0))
带有MIN的索引匹配(INDEX MATCH)。
要找到D列中的最小值并从C列中拉出一个相关的值,请使用这个。
=index(c2:c10, match(min(d2:d10), d2:d10, 0))
与平均数的指数匹配
要计算出最接近D2:D10中的平均值的数值,并从C列中得到一个相应的数值,可以使用这个公式。
=index(c2:c10, match(average(d2:d10), d2:d10, -1 ))
根据你的数据组织方式,向MATCH函数的第三个参数(match_type)提供1或-1。
- 如果你的查询列(在我们的例子中是D列)被排序为 升序 该公式将计算出最大的值,即 不到 或等同于平均值。
- 如果你的查找列是排序的 下降 该公式将计算出最小的值,该值为-1。 大于 或等同于平均值。
- 如果你的查找数组包含一个值 完全相等 你可以输入0表示完全匹配,不需要排序。
在我们的例子中,D列中的人口是按降序排序的,所以我们使用-1作为匹配类型。 结果,我们得到 "东京",因为它的人口(13,189,000)是大于平均数(12,269,006)的最接近的匹配。
你可能很想知道,VLOOKUP也可以进行这样的计算,但是作为一个数组公式:VLOOKUP与AVERAGE、MAX、MIN。
与IFNA/IFERROR一起使用INDEX MATCH
你可能已经注意到,如果Excel中的INDEX MATCH公式找不到查询值,就会产生一个#N/A的错误。 如果你想用更有意义的东西来代替标准的错误符号,可以用IFNA函数来包装你的INDEX MATCH公式。 例如::
=IFNA(INDEX(C2:C10, MATCH(F1,A2:A10,0)), "未找到匹配对象")
而现在,如果有人输入一个不存在于查询范围内的查询表,该公式将明确地通知用户没有找到匹配。
如果你想捕捉所有的错误,而不仅仅是#N/A,使用IFERROR函数而不是IFNA。
=IFERROR(INDEX(C2:C10, MATCH(F1,A2:A10,0)), "Oops, something went wrong!")
请记住,在许多情况下,掩饰所有的错误可能是不明智的,因为它们提醒你公式中可能存在的错误。
这就是如何在Excel中使用INDEX和MATCH。 我希望我们的公式例子能对你有所帮助,并期待下周在我们的博客上见到你!
供下载的实践工作手册
Excel INDEX MATCH示例(.xlsx文件)。