CoreGPT
Microsoft 365阅读约 14 分钟

XLOOKUP 和 VLOOKUP 的区别:怎么选?示例对比与公式转换

用同一张示例表并排对比 XLOOKUP 和 VLOOKUP:语法、向左查找、精确匹配、缺失值、插入列、旧版 Excel 兼容性,以及如何转换你现有的 VLOOKUP 公式。

XLOOKUP 和 VLOOKUP 的区别:怎么选?示例对比与公式转换

在 XLOOKUP 和 VLOOKUP 之间选择时,如果所有打开文件的人都使用 Excel for Microsoft 365、Excel 2021 或更高版本,或网页版 Excel,请使用 XLOOKUP。它能做到 VLOOKUP 的所有事情,而且更不容易出错:默认精确匹配,可以向左查找,插入列时也不会出问题。只有当工作簿必须在 Excel 2019 或更早版本中使用时,才用 VLOOKUP。

兼容性是主要的注意事项。Excel 2016 和 2019 中没有 XLOOKUP,所以对于仍在使用这些版本的人,满是 XLOOKUP 公式的文件会显示 #NAME? 错误。

本文中的公式按英文版 Excel 中的写法显示。中文版 Excel 同样使用 VLOOKUP 和 XLOOKUP 这些英文函数名称,参数之间同样使用逗号分隔。

VLOOKUPXLOOKUP
向左查找(返回查找列左侧的列)不能可以
默认匹配类型近似匹配(除非添加 FALSE)精确匹配
插入或删除列后是否仍然正确否,列序号固定不变是,区域会自动调整
自定义“未找到”提示需要 IFNA 或 IFERROR内置(if_not_found)
一次返回多列不方便可以,结果会溢出
从最后一个匹配项向上搜索不能可以(search_mode -1)
近似匹配数据必须按升序排序取下一个较小或较大的值,无需排序
通配符(*、?)可以,需精确匹配可以,需 match_mode 2
横向查找不能,那是 HLOOKUP可以,同一个函数
速度在一般工作簿中没有实际差别相同,另可对已排序数据使用二分查找
可用版本所有版本的 ExcelMicrosoft 365、Excel 2021、Excel 2024、网页版 Excel、移动应用

语法对比

=VLOOKUP(lookup_value, table_array, col_index_num, [range_lookup])
=XLOOKUP(lookup_value, lookup_array, return_array, [if_not_found], [match_mode], [search_mode])

最大的区别在于如何告诉 Excel 答案在哪里。VLOOKUP 接收整个表格,以及从该表格左边缘开始数的 列序号。XLOOKUP 则接收两个独立的区域:用于搜索的列和用于返回结果的列。

用两种方式写出同一个查找

下面是 A1:D6 中的一张小型产品列表,G2 中输入了产品 ID:

ABCD
1Product IDProductCategoryPrice
2P-101Wireless MouseAccessories$24.99
3P-102USB-C HubAccessories$39.50
4P-103Laptop StandOffice$45.00
5P-104Webcam HDVideo$59.00
6P-105Desk LampOffice$32.75

要查找 P-104 的价格:

=VLOOKUP(G2, A2:D6, 4, FALSE)
=XLOOKUP(G2, A2:A6, D2:D6)

两者都返回 $59.00。VLOOKUP 搜索 A2:D6 的第一列并返回第 4 列;FALSE 强制精确匹配。XLOOKUP 搜索 A2:A6,并从 D2:D6 中返回对应的单元格,默认就是精确匹配。

Excel 工作表,A1:D6 中是产品表,G2 中是查找 ID P-104,G4 中是 VLOOKUP 公式,G5 中的公式 =XLOOKUP(G2,A2:A6,D2:D6) 返回 $59.00,Webcam HD 所在行已高亮显示

如果要把公式向下复制整列,请用绝对引用锁定表格,例如 =XLOOKUP(G2, $A$2:$A$6, $D$2:$D$6)。当光标位于引用中时,在 Windows 上按 F4、在 Mac 上按 Cmd+T 即可添加 $ 符号。

VLOOKUP 的两个经典陷阱

1. 忘记写 FALSE(或 0)

VLOOKUP 的最后一个参数是可选的,省略时 Excel 会使用 近似匹配。使用近似匹配时,VLOOKUP 会假定第一列已经排好序,并在没有任何提示的情况下返回小于或等于你搜索值的最接近的值。

在上面的表格上试试 =VLOOKUP("P-110", A2:D6, 4)。P-110 并不存在,但你得到的不是 #N/A,而是 $32.75,也就是 P-105 的价格,因为“P-105”是最接近的较小值。在未排序的数据上,结果可能更加随机。

精确匹配的 VLOOKUP 请始终以 FALSE 或 0 结尾。XLOOKUP 避免了这个问题,因为除非你另行指定,它就使用精确匹配。

2. 写死的列序号

VLOOKUP 公式中的 4 只是一个数字。如果有人在 Product 和 Category 之间插入了一个 Supplier 列,表格就变成了 A:E,Price 移到了 E 列,而公式仍然返回第 4 列,也就是现在的 Category。你会看到“Video”,而不是 $59.00。

XLOOKUP 直接指向价格列本身(D2:D6),所以 Excel 会自动把它更新为 E2:E6,答案依然正确。

XLOOKUP 能做而 VLOOKUP 做不到的事

向左查找

VLOOKUP 只能返回查找列右侧的列。XLOOKUP 不在乎方向。要根据 G2 中的产品名称查找产品 ID:

=XLOOKUP(G2, B2:B6, A2:A6)

当 G2 为“Desk Lamp”时,这个公式返回 P-105,尽管 A 列在 B 列的左边。

Excel 工作表,G2 中是 Desk Lamp,G4 中的公式 =XLOOKUP(G2,B2:B6,A2:A6) 从位于 Product 列左侧的 A 列返回 P-105,并有一个箭头从 Desk Lamp 指向 P-105

找不到时显示友好的提示

=XLOOKUP(G2, A2:A6, D2:D6, "Not found")

VLOOKUP 的等价写法需要再套一层:=IFNA(VLOOKUP(G2, A2:D6, 4, FALSE), "Not found")。

用一个公式返回多列

=XLOOKUP(G2, A2:A6, B2:D6)

对于 P-104,这会把 Webcam HD、Video 和 $59.00 溢出到并排的三个单元格中。请让这些单元格保持为空,否则会出现 #SPILL! 错误。

查找最后一个匹配项,而不是第一个

在同一个客户多次出现的日志中,把 search_mode 设为 -1,即可从下往上搜索,得到最新的记录:

=XLOOKUP(G2, A2:A500, C2:C500, "Not found", 0, -1)

无需排序的近似匹配

对于阶梯价格或佣金比例,VLOOKUP 的近似匹配只有在第一列按升序排序时才有效。XLOOKUP 的 match_mode -1(精确匹配,或取下一个较小的项)和 1(精确匹配,或取下一个较大的项)则不需要排序。假设最低订单金额在 J2:J5,折扣在 K2:K5:

=VLOOKUP(B2, J2:K5, 2, TRUE)
=XLOOKUP(B2, J2:J5, K2:K5, , -1)

通配符

两者都支持 * 和 ?,但 XLOOKUP 需要 match_mode 2 才会把它们当作通配符:

=VLOOKUP("Desk*", B2:D6, 3, FALSE)
=XLOOKUP("Desk*", B2:B6, D2:D6, , 2)

对于 Desk Lamp,两者都返回 $32.75。

INDEX/MATCH:经典的替代方案

在有 XLOOKUP 之前,解决 VLOOKUP 局限性的标准方法是 INDEX 配合 MATCH。它可以向左查找,插入列后依然正确,并且在所有版本的 Excel 中都能使用,因此是必须能在 Excel 2019 或更早版本中打开的文件的最佳选择:

=INDEX(D2:D6, MATCH(G2, A2:A6, 0))
=INDEX(A2:A6, MATCH(G2, B2:B6, 0))

第一个公式返回 G2 中 ID 对应的价格;第二个是向左查找的示例。MATCH 中的 0 表示精确匹配,和 VLOOKUP 的 FALSE 一样,很容易被忘掉。XLOOKUP 其实就是同一思路更简短、更安全的版本。

如何把 VLOOKUP 公式转换为 XLOOKUP

没有内置的转换工具,但转换过程是机械的:

  1. 找出你的 VLOOKUP:按 Ctrl+F(Mac 上为 Cmd+F),输入 VLOOKUP,如果额外设置被隐藏则点击 选项,将 查找范围 设为 公式,然后点击 查找全部。
  2. 第一个参数(查找值)保持不变。
  3. 把表格替换为它的 第一列,作为 lookup_array。
  4. 把列序号替换为 对应的列,作为 return_array。从 A 列开始的表格中的第 5 列就是 E 列。
  5. 去掉 FALSE。如果原公式以 TRUE 结尾或没有最后一个参数,请添加 match_mode -1,以保持“取下一个较小值”的行为。

例如:

=VLOOKUP(A2, Products!$A$2:$F$500, 5, FALSE)
=XLOOKUP(A2, Products!$A$2:$A$500, Products!$E$2:$E$500)

在转换整张工作表之前,请先对照旧公式测试几个结果。在未排序数据上使用近似匹配的 VLOOKUP 可能一直在返回错误的值,所以 XLOOKUP 的答案出现差异是正常的。

XLOOKUP 文件在 Excel 2016 或 2019 中打开会怎样

工作簿可以打开,但这些版本不认识这个函数。它在编辑栏中显示为 =_xlfn.XLOOKUP(...)。单元格起初可能仍显示上次保存的结果,但公式一旦重新计算,就会返回 #NAME?。

如果你需要与使用旧版本的人共享文件:

  • 改用 INDEX/MATCH 或 VLOOKUP,或者
  • 发送一份把结果粘贴为数值的副本(复制 → 选择性粘贴 → 数值)。

这同样适用于 FILTER、UNIQUE 和 XMATCH 等其他较新的函数。

Google 表格中的 XLOOKUP

Google 表格(Google Sheets)也有 XLOOKUP,参数顺序相同:=XLOOKUP(search_key, lookup_range, result_range, [missing_value], [match_mode], [search_mode])。本文中的公式在那里原样可用,所以对于要在 Excel 和 Sheets 之间流转的文件,XLOOKUP 是安全的选择。

为什么你的查找返回 #N/A 或错误的值

  • 多余的空格。 带尾部空格的“P-104 ”与“P-104”不匹配。请用 TRIM 清理数据。
  • 以文本形式存储的数字。 以文本形式输入的 ID 无法与以数字形式存储的同一个 ID 匹配。请留意单元格角上的绿色三角,并把整列转换为同一种类型。
  • VLOOKUP 中缺少 FALSE。 你会得到一个看似合理但错误的答案,而不是 #N/A。
  • 复制公式时区域发生了移动。 请对查找表使用 $ 绝对引用。
  • VLOOKUP 返回 #REF!。 列序号大于表格的列数。
  • XLOOKUP 返回 #VALUE!。 查找区域和返回区域的大小不同,例如 A2:A6 和 D2:D60。
  • #NAME? 函数名拼写错误,或者文件是在不含 XLOOKUP 的版本中打开的。

常见问题

XLOOKUP 比 VLOOKUP 好吗? 是的,几乎在所有用途上都是如此。它默认精确匹配,可以向任意方向查找,列移动时不会出错,处理缺失值时也不需要再套公式。VLOOKUP 唯一真正的优势是它在所有版本的 Excel 中都能使用。

XLOOKUP 比 VLOOKUP 快吗? 在日常工作簿中你不会注意到差别。在非常大的已排序列表上,XLOOKUP 的二分查找模式(search_mode 为 2 或 -2)可以加快速度,但如果数据没有排序,就会返回错误的结果。

为什么 XLOOKUP 在我的电脑上显示 #NAME? 你的 Excel 版本不包含 XLOOKUP。它存在于 Microsoft 365、Excel 2021 及更高版本以及网页版 Excel 中,但不在 Excel 2019 或 2016 中。请改用 INDEX/MATCH。

XLOOKUP 也能取代 HLOOKUP 吗? 可以。如果查找区域和返回区域是行而不是列,XLOOKUP 会用相同的语法进行横向搜索。

XLOOKUP 能返回所有匹配项,而不只是第一个吗? 不能,它只返回一个匹配项(或一行多列)。要获取所有匹配的行,请使用 FILTER,例如 =FILTER(A2:D6, C2:C6="Office")。

我还需要学习 VLOOKUP 吗? 值得认识它,因为你会在较旧的工作簿和模板中遇到它。编写新公式时请学习 XLOOKUP,并记住 INDEX/MATCH,用于必须在旧版 Excel 中打开的文件。

让 AI 帮你写查找公式

查找公式是小细节(比如漏写的 FALSE 或移位的区域)最容易造成隐性错误的地方。CoreGPT for Excel 让你描述自己的需求,比如“查找 G2 中产品 ID 对应的价格”或“把每一行标记为高于或低于目标”,然后把公式写入你的工作表,并附上简短的说明。可免费开始使用,支持 Windows、Mac 和网页版 Excel。

立即试用:CoreGPT for Excel

相关阅读:

继续阅读

Microsoft 365

Excel 下拉菜单怎么做?创建下拉列表并让它自动更新

用“数据验证”为任意 Excel 单元格添加下拉列表,可以基于手动输入的选项、单元格区域或表格创建,让列表自动扩展;还能创建二级联动下拉菜单,并修复下拉箭头不显示或列表不更新的问题。

阅读更多