Excel INDEX MATCH与VLOOKUP的比较--公式实例

  • Share This
Michael Brown

本教程展示了如何在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个主要原因

    1. 从右到左的查询。 任何受过教育的用户都知道,VLOOKUP不能向左查找,这意味着你的查找值应该总是在表格的最左边一列。 INDEX MATCH可以轻松地进行左查找!下面的例子显示了它的作用:如何在Excel中向左查找一个值。
    2. 安全地插入或删除列。 当一个新的列被删除或添加到查询表中时,VLOOKUP公式会被破坏或提供不正确的结果,因为VLOOKUP的语法要求指定你想提取数据的列的索引号。 自然,当你添加或删除列时,索引号会改变。

      使用INDEX MATCH,你指定返回的列范围,而不是索引号。 因此,你可以自由地插入和删除任何你想要的列,而不必担心更新每个相关的公式。

    3. 对查询值的大小没有限制。 当使用VLOOKUP函数时,你的查找条件的总长度不能超过255个字符,否则你将最终出现#VALUE!错误。 因此,如果你的数据集包含长字符串,INDEX MATCH是唯一可行的解决方案。
    4. 更高的处理速度。 如果你的表格相对较小,那么在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文件)。

    Michael Brown is a dedicated technology enthusiast with a passion for simplifying complex processes using software tools. With more than a decade of experience in the tech industry, he has honed his skills in Microsoft Excel and Outlook, as well as Google Sheets and Docs. Michael's blog is dedicated to sharing his knowledge and expertise with others, providing easy-to-follow tips and tutorials for improving productivity and efficiency. Whether you're a seasoned professional or a beginner, Michael's blog offers valuable insights and practical advice for getting the most out of these essential software tools.