=XLOOKUP(F2,A2:A6,C2:C6) 在 A2:A6 中查找 F2 的值,并返回 C2:C6 同一行的值。它默认精确匹配,查找列可以位于任何位置,需要 Excel 2021 或 Microsoft 365(在 Excel 2019 及更早版本中请使用 INDEX 和 MATCH)。在 F2 中输入另一个商品试试。
| A | B | C | D | E | F | G | |
|---|---|---|---|---|---|---|---|
| 1 | Product | Category | Price | Stock | Look for | Price | |
| 2 | Apple | Fruit | $1.20 | 40 | Bread | $2.40 | |
| 3 | Pear | Fruit | $1.50 | 25 | |||
| 4 | Carrot | Vegetable | $0.80 | 60 | |||
| 5 | Bread | Bakery | $2.40 | 15 | |||
| 6 | Milk | Dairy | $1.10 | 30 |
点击 G2:查找区域和返回区域会分别用框线标出。把 C2:C6 改成 B2:B6,G2 就会返回类别。这里没有需要数的列号,所以在 A 列和 C 列之间插入一列也不会破坏公式:Excel 会同时移动两个区域。
XLOOKUP 语法
=XLOOKUP(lookup_value, lookup_array, return_array, [if_not_found], [match_mode], [search_mode])
| 参数 | 作用 | 默认值 |
|---|---|---|
lookup_value | 要查找的值。 | 必填 |
lookup_array | 要搜索的列(或行)。 | 必填 |
return_array | 要返回值的列、行或区域,高度与 lookup_array 相同。 | 必填 |
if_not_found | 没有匹配项时显示的内容。 | #N/A |
match_mode | 0 精确匹配,-1 精确匹配或下一个较小值,1 精确匹配或下一个较大值,2 通配符匹配。 | 0 |
search_mode | 1 从第一个到最后一个,-1 从最后一个到第一个,2 和 -2 对已排序数据做二分查找。 | 1 |
只有前三个参数是必填的。想跳过某个可选参数、设置它后面的参数时,在两个逗号之间留空即可:=XLOOKUP(F2,A2:A6,C2:C6,,0,-1) 设置了 search_mode,而 if_not_found 保持默认值。
一次返回多列
给 XLOOKUP 一个多列宽的返回区域,就能取回整行数据。结果会溢出到公式旁边的单元格中。
| A | B | C | D | |
|---|---|---|---|---|
| 1 | Product | Category | Price | Stock |
| 2 | Apple | Fruit | $1.20 | 40 |
| 3 | Pear | Fruit | $1.50 | 25 |
| 4 | Carrot | Vegetable | $0.80 | 60 |
| 5 | Bread | Bakery | $2.40 | 15 |
| 6 | Milk | Dairy | $1.10 | 30 |
| 7 | Look for | Carrot | ||
| 8 | Result | Vegetable | $0.80 | 60 |
B8 中的一个公式会把 Vegetable、$0.80 和 60 填入 B8:D8。在 C8 中随便输入点内容,B8 就会显示 #SPILL!,因为结果没有空间了;删掉它,结果就会恢复。想按其他顺序返回各列,可以用 CHOOSECOLS 包住返回区域:=XLOOKUP(B7,A2:A6,CHOOSECOLS(B2:D6,3,1)) 先给出 Stock,再给出 Category。
用 XLOOKUP 向左查找,以及找不到时的提示
查找列不必排在第一列。下面的 XLOOKUP 在 C 列中搜索价格,并返回 A 列中的商品名称,这是 VLOOKUP 做不到的。第四个参数指定没有商品是这个价格时显示什么。
| A | B | C | D | E | F | G | |
|---|---|---|---|---|---|---|---|
| 1 | Product | Category | Price | Stock | Price | Product | |
| 2 | Apple | Fruit | $1.20 | 40 | $2.40 | Bread | |
| 3 | Pear | Fruit | $1.50 | 25 | |||
| 4 | Carrot | Vegetable | $0.80 | 60 | |||
| 5 | Bread | Bakery | $2.40 | 15 | |||
| 6 | Milk | Dairy | $1.10 | 30 |
$2.40 返回 Bread。把 F2 改成 3,G2 显示的是“No product”而不是 #N/A。第四个参数用 "" 会显示一个看起来为空的单元格。if_not_found 只处理“找不到”:返回区域高度不对时仍然会得到 #VALUE!,而这正是你希望看到的。
查找最后一个匹配项
XLOOKUP 返回从上往下的第一个匹配项。把第六个参数 search_mode 设为 -1,它就会从底部开始查找,因此返回最后一个匹配项:最新的订单、最近的价格、最后的状态。
| A | B | C | D | E | F | G | |
|---|---|---|---|---|---|---|---|
| 1 | Date | Customer | Amount | Customer | First | Last | |
| 2 | 2026-03-02 | Ben | 120 | Ben | 120 | 60 | |
| 3 | 2026-03-05 | Ana | 80 | ||||
| 4 | 2026-03-09 | Ben | 45 | ||||
| 5 | 2026-03-12 | Cara | 200 | ||||
| 6 | 2026-03-20 | Ben | 60 | ||||
| 7 | 2026-03-24 | Ana | 95 |
Ben 的第一笔订单是 120,最后一笔是 60。把 E2 改成 Ana:80 和 95。这依赖于各行按日期排序。如果没有排序,就改为查找该客户的最晚日期:=XLOOKUP(1,(B2:B7=E2)*(A2:A7=MAXIFS(A2:A7,B2:B7,E2)),C2:C7)。
近似匹配:下一个较小值或下一个较大值
match_mode 为 -1 时返回精确匹配,没有精确匹配时返回下一个较小的值。这正是区间的规则:佣金档位、税率档次、成绩等级。与使用 TRUE 的 VLOOKUP 不同,表格不需要排序。下面的区间故意没有按顺序排列。
| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | Sales from | Rate | Rep | Sales | Rate | |
| 2 | 5000 | 5% | Ana | 750 | 0% | |
| 3 | 0 | 0% | Ben | 4,200 | 3% | |
| 4 | 10000 | 8% | Cara | 5,000 | 5% | |
| 5 | 1000 | 3% | Dev | 12,500 | 8% |
Ben 的 4,200 落在 1,000 和 5,000 之间,所以他得到 1,000 这一档的 3%。Cara 的 5,000 是精确匹配,得到 5%。match_mode 为 1 时规则相反,取精确匹配或下一个较大值,适合回答“放得下的最小箱子”或“下一个配送时段”这类问题:=XLOOKUP(18,{5;12;25;50},{"S";"M";"L";"XL"},,1) 返回 L。
XLOOKUP 使用通配符
match_mode 为 2 时,*(任意多个字符)和 ?(一个字符)会变成通配符。不设置它,XLOOKUP 会按字面查找这些字符。这一点和 VLOOKUP 正好相反(VLOOKUP 的精确匹配支持通配符),也是带通配符的 XLOOKUP 返回 #N/A 或 if_not_found 文本的常见原因:
=XLOOKUP("*coffee*",A2:A6,C2:C6,"None") None: no product is named *coffee*
=XLOOKUP("*coffee*",A2:A6,C2:C6,"None",2) 2.9, the price of Iced coffee
| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | Product | Category | Price | Contains | Price | |
| 2 | Green tea | Drinks | $3.20 | coffee | $2.90 | |
| 3 | Iced coffee | Drinks | $2.90 | |||
| 4 | Coffee beans | Pantry | $8.50 | |||
| 5 | Black tea | Drinks | $2.70 | |||
| 6 | Orange juice | Drinks | $3.40 |
“coffee”首先找到 Iced coffee,8.50。和 Excel 的所有查找一样,匹配不区分大小写。要在 match_mode 2 中查找真正的星号或问号,在它前面加波浪号:"~*"。
XLOOKUP 双向查找
返回整行的 XLOOKUP 可以作为另一个 XLOOKUP 的返回区域。内层按地区选出行,外层再从这一行中选出对应月份的列。
| A | B | C | D | |
|---|---|---|---|---|
| 1 | Region | Jan | Feb | Mar |
| 2 | North | 4,200 | 3,900 | 4,800 |
| 3 | South | 3,100 | 3,600 | 3,300 |
| 4 | East | 5,200 | 4,700 | 5,600 |
| 5 | West | 2,800 | 3,000 | 3,400 |
| 6 | Region | South | ||
| 7 | Month | Feb | ||
| 8 | Sales | 3,600 |
XLOOKUP(B6,A2:A5,B2:D5) 返回 South 这一行:3100、3600 和 3300。外层 XLOOKUP 在 B1:D1 中找到 Feb,并从这一行中取出对应的值:3,600。在 B6 和 B7 中选择其他地区和月份试试。同一查找的 INDEX 和 MATCH 写法见 INDEX 和 MATCH 页面。
旧版 Excel 和 Google Sheets 中的 XLOOKUP
XLOOKUP 存在于 Excel 2021、Excel 2024、Microsoft 365、Excel 网页版和移动应用中。如果在 Excel 2019 或更早版本中打开使用了它的文件,公式一重新计算就会显示 #NAME?。当文件必须在所有版本中都能用时,请用 INDEX 和 MATCH 来写查找,所有版本都支持:
=XLOOKUP(F2, A2:A6, C2:C6, "Not found")
=IFNA(INDEX(C2:C6, MATCH(F2, A2:A6, 0)), "Not found")
Google Sheets 从 2022 年起就有 XLOOKUP,参数完全相同。两者区别的对照见 VLOOKUP 与 XLOOKUP。要同时按两列匹配(商品和尺寸、姓名和日期),=XLOOKUP(1,(B2:B6=E2)*(C2:C6=F2),D2:D6) 这种写法在 多条件查找 页面中有讲解。
练习:返回价格,或返回“Not found”
| A | B | C | D | E | F | G | |
|---|---|---|---|---|---|---|---|
| 1 | Product | Category | Price | Stock | Look for | Price | |
| 2 | Apple | Fruit | $1.20 | 40 | Kiwi | ||
| 3 | Pear | Fruit | $1.50 | 25 | |||
| 4 | Carrot | Vegetable | $0.80 | 60 | |||
| 5 | Bread | Bakery | $2.40 | 15 | |||
| 6 | Milk | Dairy | $1.10 | 30 |
轮到你了: 在 G2 中返回 F2 中商品的价格;如果它不在列表中,就返回文本 Not found。
练习:按订单金额确定折扣
| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Order from | Discount | Order | Discount | |
| 2 | $0 | 0% | $320 | ||
| 3 | $100 | 5% | |||
| 4 | $250 | 10% | |||
| 5 | $500 | 15% |
轮到你了: 每个折扣从对应的订单金额起生效。在 E2 中使用 XLOOKUP,返回 D2 中订单金额对应的折扣。
常见问题
Excel 中的 XLOOKUP 怎么用?
给它三个参数:要找什么、在哪一列查找、返回哪一列。=XLOOKUP("Pear",A2:A6,C2:C6) 在 A2:A6 中找到 Pear,并返回 C2:C6 同一行的值。除非你另行指定,它默认使用精确匹配。
哪些 Excel 版本有 XLOOKUP?
Excel 2021、Excel 2024、Microsoft 365 和 Excel 网页版。在 Excel 2019 及更早版本中,公式会显示 #NAME?;这时请改用 =INDEX(C2:C6,MATCH(F2,A2:A6,0))。Google Sheets 也有 XLOOKUP。
怎样让 XLOOKUP 返回空白或文本,而不是 #N/A?
使用第四个参数 if_not_found:=XLOOKUP(F2,A2:A6,C2:C6,"Not found"),或者用 "" 得到一个看起来为空的单元格。它只替换“找不到”的情况,其他错误照样显示。
怎样用 XLOOKUP 查找最后一个匹配项?
把第六个参数 search_mode 设为 -1,让查找从下往上进行:=XLOOKUP("Ben",B2:B7,C2:C7,,0,-1) 返回 Ben 的最后一笔金额,而不是第一笔。
XLOOKUP 能返回多列吗?
能。给它一个多列宽的返回区域,例如 =XLOOKUP(F2,A2:A6,B2:D6),结果会溢出到旁边的单元格中。溢出区域的单元格必须为空,否则 Excel 会显示 #SPILL!。