VLOOKUP 能做的 XLOOKUP 都能做,而且更不容易出错:它默认精确匹配,用区域而不是数字来指定返回列,能向左查找,还有自己的“未找到”参数。当文件必须在 Excel 2019 或更早版本中使用时,请用 VLOOKUP,因为那些版本没有 XLOOKUP。下面的表格用两种方式完成同一个查找。
| A | B | C | D | E | F | G | |
|---|---|---|---|---|---|---|---|
| 1 | Product | Category | Price | Stock | Look for | Pear | |
| 2 | Apple | Fruit | $1.20 | 40 | VLOOKUP | $1.50 | |
| 3 | Pear | Fruit | $1.50 | 25 | XLOOKUP | $1.50 | |
| 4 | Carrot | Vegetable | $0.80 | 60 | |||
| 5 | Bread | Bakery | $2.40 | 15 | |||
| 6 | Milk | Dairy | $1.10 | 30 |
两个公式都返回 $1.50。分别单击这两个公式:VLOOKUP 框出整个表格 A2:D6,并在其中数到第 3 列;XLOOKUP 只框出它查找的列和它返回的列。
VLOOKUP 与 XLOOKUP 对比
| VLOOKUP | XLOOKUP | |
|---|---|---|
| Excel 版本 | 所有版本 | Excel 2021、2024、Microsoft 365、网页版 |
| 默认匹配方式 | 近似匹配(省略第 4 个参数时) | 精确匹配 |
| 返回列 | 在表格中数出来的列号 | 一个区域 |
| 在表格中间插入一列 | 返回错误的列 | 仍然正常 |
| 向左查找 | 不能 | 能 |
| 找不到值 | #N/A,需要用 IFNA 包起来 | 第 4 个参数,"Not found" |
| 最后一个匹配项 | 不能 | search_mode 为 -1 |
| 一次返回多列 | 每个公式一列(Microsoft 365 中可以用 {2,3} 作列号) | 返回区域包含多列时会全部溢出 |
| 近似匹配 | 下一个较小值,数据必须排序 | 下一个较小值或下一个较大值,顺序不限 |
| 通配符 | 使用 FALSE 时可用 | 只在 match_mode 为 2 时可用 |
| 横向查找 | 需要用 HLOOKUP | 同一个函数 |
两者都不区分大小写。精确匹配时,两者都返回从上往下的第一个匹配项,除非让 XLOOKUP 从下往上查找。
找不到值:IFNA 与第四个参数
| A | B | C | D | E | F | G | |
|---|---|---|---|---|---|---|---|
| 1 | Product | Category | Price | Stock | Look for | Kiwi | |
| 2 | Apple | Fruit | $1.20 | 40 | VLOOKUP | #N/A | |
| 3 | Pear | Fruit | $1.50 | 25 | with IFNA | Not found | |
| 4 | Carrot | Vegetable | $0.80 | 60 | XLOOKUP | Not found | |
| 5 | Bread | Bakery | $2.40 | 15 | |||
| 6 | Milk | Dairy | $1.10 | 30 |
#N/A 要查找的值不在查找范围内。单独的 VLOOKUP 显示 #N/A。VLOOKUP 需要用 IFNA 包起来才能显示文本,而 XLOOKUP 用第四个参数就能做到。在 G1 中输入 Milk,三个公式的结果都是 $1.10。
向左查找与移动列
VLOOKUP 的两个结构性限制都来自列号。它只能从查找的列往右数,而且表格变化时这个数字不会跟着变:在 Category 和 Price 之间插入一列,=VLOOKUP(G1,A2:D6,3,FALSE) 仍然返回第 3 列,而那已经是新插入的列了。XLOOKUP 用区域来引用返回列,所以 Excel 会像调整其他引用一样调整它,查找列也可以在任何位置。
| A | B | C | D | E | F | G | |
|---|---|---|---|---|---|---|---|
| 1 | Product | Category | Price | Stock | Price | $0.80 | |
| 2 | Apple | Fruit | $1.20 | 40 | XLOOKUP | Carrot | |
| 3 | Pear | Fruit | $1.50 | 25 | INDEX MATCH | Carrot | |
| 4 | Carrot | Vegetable | $0.80 | 60 | |||
| 5 | Bread | Bakery | $2.40 | 15 | |||
| 6 | Milk | Dairy | $1.10 | 30 |
两个公式都返回 Carrot。这里没有 VLOOKUP 的写法:产品名在价格的左边。在旧版 Excel 中,答案是 G3 中的 INDEX MATCH,它在插入列后也不会出错。INDEX 和 MATCH 一文对此有详细讲解。
近似匹配的两种写法
对于分段查找,VLOOKUP 使用 TRUE,并要求第一列按升序排序。XLOOKUP 使用 match_mode -1,不需要排序;match_mode 1 则返回下一个较大值,这是 VLOOKUP 做不到的。
| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Sales from | Rate | Sales | 4,200 | |
| 2 | 0 | 0% | VLOOKUP | 3% | |
| 3 | 1000 | 3% | XLOOKUP | 3% | |
| 4 | 5000 | 5% | |||
| 5 | 10000 | 8% |
销售额为 4,200 时,两个公式都返回 3%。把 E1 改成 10000,两个公式都返回 8%。
什么时候继续用 VLOOKUP
- 文件要与使用 Excel 2019、2016 或更早版本的人共享。 在那些版本中 XLOOKUP 会显示 #NAME?。另一个在所有版本中都能用的选择是 INDEX MATCH。
- 工作簿中已经有几百个能正常工作的 VLOOKUP。 全部改写收益不大;新公式用 XLOOKUP 就好。
速度不是选择其中一个的理由。在普通表格中两者都是瞬间完成,在非常大的已排序列表中,XLOOKUP 的二分查找(search_mode 为 2)和使用 TRUE 的 VLOOKUP 都很快。
Google Sheets 支持这两个函数,参数也相同。
练习:改写一个 VLOOKUP
| A | B | C | D | E | F | G | |
|---|---|---|---|---|---|---|---|
| 1 | Product | Category | Price | Stock | Look for | Bread | |
| 2 | Apple | Fruit | $1.20 | 40 | Stock | ||
| 3 | Pear | Fruit | $1.50 | 25 | |||
| 4 | Carrot | Vegetable | $0.80 | 60 | |||
| 5 | Bread | Bakery | $2.40 | 15 | |||
| 6 | Milk | Dairy | $1.10 | 30 |
轮到你了: =VLOOKUP(G1,A2:D6,4,FALSE) 返回 G1 中产品的库存。在 G2 中用 XLOOKUP 写出同样的查找。
常见问题
XLOOKUP 比 VLOOKUP 好吗?
在 Excel 2021 或 Microsoft 365 中做新表格的话,是的:它默认精确匹配,没有一移动列就出错的列号,能向左查找,还内置了未找到时显示的文本。只有当文件必须在 Excel 2019 或更早版本中使用时,VLOOKUP 才更合适,因为在那些版本中 XLOOKUP 会显示 #NAME?。
XLOOKUP 比 VLOOKUP 快吗?
在普通表格中你察觉不到差别,两者查找几千行都是瞬间完成。在非常大的已排序数据中,XLOOKUP 的二分查找模式(search_mode 为 2)比线性查找更快,而使用 TRUE 的 VLOOKUP 也是二分查找。
XLOOKUP 和 INDEX MATCH 有什么区别?
它们能完成同样的查找。XLOOKUP 是一个函数,参数更简单,还有“未找到”参数;INDEX MATCH 在所有 Excel 版本中都能用。=XLOOKUP(F2,A2:A6,C2:C6) 和 =INDEX(C2:C6,MATCH(F2,A2:A6,0)) 返回相同的值。
怎么把 VLOOKUP 改写成 XLOOKUP?
保留查找值,把表格拆成第一列和要返回的那一列,去掉列号和 FALSE:=VLOOKUP(F2,A2:D6,3,FALSE) 变成 =XLOOKUP(F2,A2:A6,C2:C6)。