Menu

Excel XLOOKUP 函数:公式、示例与匹配模式

=XLOOKUP(F2,A2:A6,C2:C6) 在 A2:A6 中查找 F2,并返回 C2:C6 同一行的值。找不到时显示的文本、一次返回多列、向左查找、查找最后一个匹配项、近似匹配和通配符匹配。

本页的每张表格都是实时的:修改数字或公式,就会重新计算。

=XLOOKUP(F2,A2:A6,C2:C6) 在 A2:A6 中查找 F2 的值,并返回 C2:C6 同一行的值。它默认精确匹配,查找列可以位于任何位置,需要 Excel 2021 或 Microsoft 365(在 Excel 2019 及更早版本中请使用 INDEX 和 MATCH)。在 F2 中输入另一个商品试试。

商品的价格
G2
ABCDEFG
1ProductCategoryPriceStockLook forPrice
2AppleFruit$1.2040Bread$2.40
3PearFruit$1.5025
4CarrotVegetable$0.8060
5BreadBakery$2.4015
6MilkDairy$1.1030
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

点击 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_mode0 精确匹配,-1 精确匹配或下一个较小值,1 精确匹配或下一个较大值,2 通配符匹配。0
search_mode1 从第一个到最后一个,-1 从最后一个到第一个,2 和 -2 对已排序数据做二分查找。1

只有前三个参数是必填的。想跳过某个可选参数、设置它后面的参数时,在两个逗号之间留空即可:=XLOOKUP(F2,A2:A6,C2:C6,,0,-1) 设置了 search_mode,而 if_not_found 保持默认值。

一次返回多列

给 XLOOKUP 一个多列宽的返回区域,就能取回整行数据。结果会溢出到公式旁边的单元格中。

一个商品的所有字段
B8
ABCD
1ProductCategoryPriceStock
2AppleFruit$1.2040
3PearFruit$1.5025
4CarrotVegetable$0.8060
5BreadBakery$2.4015
6MilkDairy$1.1030
7Look forCarrot
8ResultVegetable$0.8060
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

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 做不到的。第四个参数指定没有商品是这个价格时显示什么。

哪个商品是这个价格?
G2
ABCDEFG
1ProductCategoryPriceStockPriceProduct
2AppleFruit$1.2040$2.40Bread
3PearFruit$1.5025
4CarrotVegetable$0.8060
5BreadBakery$2.4015
6MilkDairy$1.1030
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

$2.40 返回 Bread。把 F2 改成 3,G2 显示的是“No product”而不是 #N/A。第四个参数用 "" 会显示一个看起来为空的单元格。if_not_found 只处理“找不到”:返回区域高度不对时仍然会得到 #VALUE!,而这正是你希望看到的。

查找最后一个匹配项

XLOOKUP 返回从上往下的第一个匹配项。把第六个参数 search_mode 设为 -1,它就会从底部开始查找,因此返回最后一个匹配项:最新的订单、最近的价格、最后的状态。

某个客户的第一笔和最后一笔订单
G2
ABCDEFG
1DateCustomerAmountCustomerFirstLast
22026-03-02Ben120Ben12060
32026-03-05Ana80
42026-03-09Ben45
52026-03-12Cara200
62026-03-20Ben60
72026-03-24Ana95
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

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 不同,表格不需要排序。下面的区间故意没有按顺序排列。

按销售额确定佣金比例
F2
ABCDEF
1Sales fromRateRepSalesRate
250005%Ana7500%
300%Ben4,2003%
4100008%Cara5,0005%
510003%Dev12,5008%
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

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
名称包含指定文本的第一个商品
F2
ABCDEF
1ProductCategoryPriceContainsPrice
2Green teaDrinks$3.20coffee$2.90
3Iced coffeeDrinks$2.90
4Coffee beansPantry$8.50
5Black teaDrinks$2.70
6Orange juiceDrinks$3.40
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

“coffee”首先找到 Iced coffee,2.90。加上第六个参数‘−1‘,它会找到Coffeebeans,2.90。加上第六个参数 `-1`,它会找到 Coffee beans,8.50。和 Excel 的所有查找一样,匹配不区分大小写。要在 match_mode 2 中查找真正的星号或问号,在它前面加波浪号:"~*"。

XLOOKUP 双向查找

返回整行的 XLOOKUP 可以作为另一个 XLOOKUP 的返回区域。内层按地区选出行,外层再从这一行中选出对应月份的列。

按地区和月份统计的销售额
B8
ABCD
1RegionJanFebMar
2North4,2003,9004,800
3South3,1003,6003,300
4East5,2004,7005,600
5West2,8003,0003,400
6RegionSouth
7MonthFeb
8Sales3,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”

价目表
G2
ABCDEFG
1ProductCategoryPriceStockLook forPrice
2AppleFruit$1.2040Kiwi
3PearFruit$1.5025
4CarrotVegetable$0.8060
5BreadBakery$2.4015
6MilkDairy$1.1030
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

轮到你了: 在 G2 中返回 F2 中商品的价格;如果它不在列表中,就返回文本 Not found。

练习:按订单金额确定折扣

折扣档位
E2
ABCDE
1Order fromDiscountOrderDiscount
2$00%$320
3$1005%
4$25010%
5$50015%
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

轮到你了: 每个折扣从对应的订单金额起生效。在 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!。

Coddy 编程语言插图

和 Coddy 一起学编程

开始