INDEX MATCH、VLOOKUP 与 XLOOKUP:5 道题看清区别

五道题,讲清人们为什么离开 VLOOKUP——以及换了之后还有什么会坏。每组先说结构性原因,再给你一个公式去判断。

会搜 INDEX MATCH 或 XLOOKUP 的人,多半已经被某个 VLOOKUP 坑过了。本页讲的就是造成这一切的两个结构性限制:VLOOKUP 只能返回右侧的列,而它的列序号是一个不会随插入列更新的数字——于是公式会悄无声息地开始返回另一批数据,一个错都不报。

INDEX/MATCH 把这两个都解决了,代价是公式长一点。XLOOKUP 除了这两个,还顺带解决了近似匹配陷阱和 IFERROR 外壳,代价是需要 Microsoft 365 或 Excel 2021 及以上。但两者都挡不住人们带过来的那个老毛病:漏写那个强制精确匹配的参数。

下面这些题就是你真正会遇到的决策——共用的工作簿该用哪个、插入一列会发生什么、为什么改写之后仍然返回错行。每题先自己判断再看解析。

三个方面,五道题

INDEX/MATCH 修好了 VLOOKUP 的哪些毛病

2 道题

是两个结构性限制,不是偏好问题。VLOOKUP 只能返回查找列右侧的列,而且它的列序号是在区域内数出来的数字——所以插入一列会静默地改变它返回的内容,公式不变、也不报错。INDEX/MATCH 两个问题都没有:它直接指向返回列,因此既能向左查,也扛得住插列。第二点在多人共用的工作簿里才是真正要命的。

通常怎么表现「INDEX MATCH 和 VLOOKUP 哪个好」·「为什么大家都说 INDEX MATCH 更好?」

第 1 题

这个公式今天是好用的。之后同事在 B 列和 C 列之间插入了一列。会怎样?

=VLOOKUP(F2, A:D, 3, FALSE)
  1. A会报 #REF!,所以你能立刻发现
  2. B它照常工作,但现在返回的是新插入那一列的数据而不是你要的——而且是静默的
  3. CExcel 会自动把序号更新成 4
  4. D什么都不变;序号是相对整张表的,不是相对区域
看答案与解析

正确答案B. 它照常工作,但现在返回的是新插入那一列的数据而不是你要的——而且是静默的

🐱 列序号是个固定的数字,插入之后 A:D 里的第 3 个位置指向了另一批数据。不会有任何报错——这正是它在多人编辑的工作簿里危险的原因。INDEX(C:C, MATCH(F2, A:A, 0)) 直接引用 C 列,插入列时引用会跟着数据一起平移,公式的含义始终是你的本意。

第 2 题

你要用 C 列的编号去查、返回 A 列的名称。哪个可行?

=VLOOKUP(F2, A:D, 1, FALSE)

=INDEX(A:A, MATCH(F2, C:C, 0))
  1. A第一个
  2. B第二个——VLOOKUP 无法返回它所查找那一列左侧的列
  3. C两个都行
  4. D都不行;这种情况必须用 XLOOKUP
看答案与解析

正确答案B. 第二个——VLOOKUP 无法返回它所查找那一列左侧的列

🐱 VLOOKUP 在给定区域的最左列里查找,用 A:D 就是拿编号去名称列里找,返回 #N/A。INDEX/MATCH 把两件事拆开——MATCH 在 C 列里找到行号,INDEX 从 A 列取那一行——方向就不再是问题。XLOOKUP 也能解决,但 INDEX/MATCH 在所有 Excel 版本里都能用,这是它至今仍值得掌握的原因。

MATCH 的第三个参数,以及它为什么必须是 0

1 道题

MATCH 的第三个参数与 VLOOKUP 的第四个作用完全相同,坑也一样:不写就默认是 1,意思是「在假定升序排列的数据上做近似匹配」。在未排序数据上,它返回的是一个看起来合理的错误行,而不是报错。除非你是有意做分档查找,否则每次都写 0——光这一个习惯就能防住 INDEX/MATCH 最常见的 bug。

通常怎么表现「INDEX MATCH 返回了错误的行」·「match_type 是什么?」

第 3 题

编号列没有排序。这个公式有什么问题?

=INDEX(C:C, MATCH(F2, A:A))
  1. AINDEX 需要三个参数
  2. BMATCH 漏了第三个参数,于是默认近似匹配,可能不报错地返回错误的行
  3. CMATCH 里不能引用整列
  4. D没有问题
看答案与解析

正确答案B. MATCH 漏了第三个参数,于是默认近似匹配,可能不报错地返回错误的行

🐱 漏写 match_type 与漏写 VLOOKUP 的 FALSE 属于同一类错误,失败方式也一样——静悄悄地。精确匹配请写 MATCH(F2, A:A, 0)。如果你确实想做分档查找(税率区间、运费档位),match_type 用 1 才是对的工具,但那时查找列必须真的是升序排列——把这一点说出口,正是「有意选择」与「意外」的分界。

XLOOKUP:什么时候换,代价是什么

2 道题

XLOOKUP 一次性消除了三个坑:默认精确匹配、可向任意方向查找、直接引用返回区域因此插列也不会坏。它还自带「找不到时返回什么」的参数,替掉了那个会连带藏起其他错误的 IFERROR 外壳。唯一真实的代价是兼容性——它需要 Microsoft 365 或 Excel 2021 及以上,把工作簿发给用旧版本的人会显示 #NAME?。

通常怎么表现「XLOOKUP 和 VLOOKUP 怎么选」·「该换成 XLOOKUP 吗?」

第 4 题

你用 XLOOKUP 重写了查找公式,把工作簿发给还在用 Excel 2019 的同事。他会看到什么?

=XLOOKUP(F2, C:C, A:A, "not found")
  1. A公式正常工作
  2. B#NAME?,因为他的版本没有 XLOOKUP 这个函数
  3. C#VALUE!
  4. DExcel 会自动转换成 VLOOKUP
看答案与解析

正确答案B. #NAME?,因为他的版本没有 XLOOKUP 这个函数

🐱 #NAME? 是 Excel 表示「我不认识这个函数名」的方式——跟你把函数名拼错时是同一个错误。它不会自动降级,而且不是「暂时不更新」那么轻:你的数据位置上直接显示的是错误。对于会流转的工作簿,INDEX/MATCH 仍是稳妥选择;自己的文件则 XLOOKUP 全面更优,值得换。

第 5 题

下面哪件事 XLOOKUP 不需要额外包裹就能处理?

  1. A找不到时返回一段自定义提示
  2. B把匹配到的行求和
  3. C跨多个已关闭的工作簿查找
  4. D按单元格颜色匹配
看答案与解析

正确答案A. 找不到时返回一段自定义提示

🐱 第四个参数就是 if_not_found,所以 XLOOKUP(F2, C:C, A:A, "not found") 替掉了惯常的 IFERROR 外壳——而且更安全,因为它只处理「没找到」这一种情况,把 #REF! 之类真正的错误留在明面上。求和要用 SUMIF/SUMIFS;跨已关闭工作簿查找不管用哪个函数都有各自限制;而任何查找函数都读不了格式。

继续练

INDEX MATCH、VLOOKUP 与 XLOOKUP — 常见问题

INDEX MATCH 真的比 VLOOKUP 好吗?

在两个具体方面确实更好:能返回左侧的列,以及因为直接引用返回列而不是靠数出来的序号,插入列也不会错位。如果是一张没人动的小表,VLOOKUP 配 FALSE 完全够用。

该全部换成 XLOOKUP 吗?

自己的文件里可以——默认精确匹配、任意方向查找、自带找不到时的返回值。要发给别人的工作簿先确认对方的 Excel 版本:早于 Microsoft 365 或 Excel 2021 的会显示 #NAME?。

我的 INDEX MATCH 为什么还是返回错行?

几乎总是漏了 MATCH 的第三个参数。不写它,MATCH 默认近似匹配并假定查找列升序排列——于是在未排序数据上返回一个看起来合理的错行,而不是报错。写 0。

大表上哪个更快?

相比结构性选择(引用整列还是有界区域、工作簿里有没有易失函数),几种写法之间的差异很小。先按正确性和可维护性选;真的在意性能,先把区域收窄,而不是先换函数。

它们能按多个条件查找吗?

XLOOKUP 和 INDEX/MATCH 都可以——把条件拼接起来,或在 MATCH 里用布尔相乘。建议等本页这些基础变成本能之后再学:大多数「多条件 bug」其实是没被诊断出来的单条件 bug。