Excel中大名鼎鼎的VLOOKUP应该是无人不知,无人不晓,它是使用频次非常高的函数,但是在实践中,当你的表格数据非常多,大量VLOOKUP的使用会导致表格计算花费大量时间,性能非常低下,表格会非常卡顿,数据达到数万行之巨的时候会非常明显。
随着新版本的Excel发布,功能更强大的XLOOKUP横空出世,XLOOKUP函数在Excel 365和Excel 2019中首次引入,相比较VLOOKUP而言,它虽然显著改善了上述的一些缺点,但是对于多条件查找,跨多个不连续列查找等方面还是有点捉襟见肘,而且对于还在使用旧版Excel的用户来讲也是触不可及。所以今天要介绍的主角就是MATCH和INDEX两个函数。
INDEX + MATCH 能干啥?
简单来说,MATCH 用来“找位置”,INDEX 用来“按位置取值”,两者组合使用可以完全实现VLOOKUP/HLOOKUP和XLOOKUP的功能,而且支持左右查找,多条件及跨列查找,而且数据量大时还不存在性能问题。为便于理解,以下是我们准备的示例数据。

MATCH函数
MATCH函数简单来说就是在指定区域查找指定的值来确定其在指定区域范围内所在的相对行或列的位置序号。
MATCH函数的语法如下:
MATCH(lookup_value, lookup_array, [match_type])根据lookup_array查找区域是行或列,MATCH函数返回Lookup_value查找值对应的行号或者列号。如果没有查找到,则返回#NA。
match_type匹配方式有1,0,-1,省略时缺省值是1。1和-1的情况下需要被查找的区域分别是升序和降序排列,在实践中不是太常用,这里就不展开了。在实际的工作中,我们所看到的数据经常是无序的,对于无序的列表,可以使用0作为match_type参数,以查找完全匹配的值。
如果match_type 为 0 且 lookup_value 为文本字符串,你也可在lookup_value参数中使用通配符问号 (?) 和星号 (*) 。问号匹配任意单个字符;星号匹配任意一串字符。如果要查找实际的问号或星号,请在字符前键入波形符 (~)。
注意:查找区域只能是一行或者一列。例如:
=MATCH("张三",A2:A7,0)这里就是表示在A2:A7的区域中,查找精确匹配“张三”所在的行号,结果就是1。如果区域是A1:A7,则结果就是2。强调:返回区域范围内的相对行或列号
INDEX函数
INDEX函数简单来说就是在指定区域根据提供的行或者列号来取对应位置的值。
INDEX函数有两种形式,我们介绍较为常见的数组形式。
INDEX函数的语法如下:
INDEX(array, row_num, [column_num])array数组 :必需。单元格区域或数组常量。
如果数组只包含一行或一列,则相对应的参数row_num 或column_num 为可选参数。
如果数组有多行和多列,但只使用row_num 或column_num,函数 INDEX 返回数组中的整行或整列,且返回值也为数组。
row_num :必需,除非存在 column_num。选择数组中的某行,函数从该行返回数值。如果省略 row_num,则需使用 column_num。
Column_num :可选。选择数组中的某列,函数从该列返回数值。如果省略 column_num,则需使用 row_num。
注意:如果将row_num 或column_num 设置为 0(零),则 INDEX 将分别返回整列或整行值的数组。
例如:
=INDEX(A2:C7,2,3)
在上述A2:C7区域中取第2行和第3列处的值,结果为3452。
如前所述,对于单列数据区域,列号参数可以省略,单行的情况同理。以下返回“李四”。

以上分别介绍了两个函数的基本用法,当然这还不是本文的重点。将它们组合在一起使用才是强强联手。
INDEX + MATCH 组合用法
经典用法(单条件查找)

=INDEX(C2:C7,MATCH("李七",A2:A7,0))执行逻辑:MATCH 找到“李七”在A 列中的行号,INDEX根据这个行号,从 C 列取销售额,返回结果1120。
左查右、右查左
不像VLOOKUP有查找列必须位于区域第一列的限制,左右随意查找。如:
=INDEX(A2:A7,MATCH(1290,C2:C7,0))返回结果:王五
多条件查找

=INDEX(C2:C7,MATCH(1,(A2:A7="王五")*(B2:B7="四川"),0))返回结果1290。
对于多条件查找传统方式是增加辅助列或组合多条件为一个条件来实现,这里使用数组公式直接实现。
注意:以上公式旧版Excel中需 Ctrl + Shift + Enter,新版 Excel(365 / 2021)直接回车即可。条件可以无限叠加,本质上是生成包含0和1的数组。
横向查找(替代 HLOOKUP)

=INDEX(A2:D2,MATCH(1268,A5:D5,0))在第5 行找到1268所在的列,然后在第2行查找对应列的数值,返回结果1230。
多条件 + 比较运算
以下我们将前面的数据稍做修改,第七行也改为张三,便于公式举例,

=INDEX(B2:B7,MATCH(1,(A2:A7="张三")*(C2:C7>2000),0))以上查找姓名为“张三”且销售额大于2000的行对应的区域,返回结果“北京”。
INDEX返回引用
前面公式中的INDEX均返回了单元格的值,这句话没错,但实际上并不完整,更准确的说法是INDEX 返回的是“单元格的引用”,Excel 在需要时才把它“当成值使用”。以下举例说明:

=INDEX(C2:C7,2):INDEX(C2:C7,5)以上我们可以看到返回的是一个区域的实际引用。这样我们除了可以使用其值以外还可以将它作为其他函数的参数进行引用。
当然INDEX和MATCH的组合用法还有很多场景,不过都基于以上讲解的拓展。
本文旨在抛砖引玉,希望读者能在实践中应用,特别是大数据场景受VLOOKUP性能问题困扰的用户。
夜雨聆风