XLOOKUP:支持向左查找、返回多列、指定未找到结果的新一代查找函数

适用场景

需要按编号查姓名,但姓名在编号左边;需要一次返回多个字段;找不到时想显示“未找到”而不是 #N/A;或者想取最后一条匹配记录。XLOOKUP 把这些需求合并成一个函数,但它是 Microsoft 365、Excel 2021 及更新版本才有的函数,Excel 2019/2016 打开会显示 _xlfn.XLOOKUP 或 #NAME?。

语法

=XLOOKUP(lookup_value, lookup_array, return_array, [if_not_found], [match_mode], [search_mode])
参数 含义 默认
lookup_value 要查找的值 必填
lookup_array 在哪一列/行查找 必填,通常是一列
return_array 返回哪一列/行/多列 必填,大小要和查找区域对应
if_not_found 找不到时返回什么 省略时返回 #N/A
match_mode 匹配方式 0 精确匹配
search_mode 搜索方向 1 从第一项到最后一项

match_mode

值 含义 用途
0 精确匹配 日常查找
-1 精确匹配,找不到时取下一个较小值 分数段、税率档位(查找区域升序)
1 精确匹配,找不到时取下一个较大值 区间下限(查找区域降序或按需要)
2 通配符匹配 *、?、~

search_mode

值 含义
1 从第一项搜索到最后一项(默认)
-1 从最后一项搜索到第一项,适合取最后一条记录
2 二分查找,升序,要求数据已排序
-2 二分查找,降序,要求数据已排序

二分查找速度快,但数据没排序时会返回错误结果且不一定报错;不确定就用 1。

示例

假设 A 列编号、B 列姓名、C 列部门,E2 是要查的编号:

查姓名
=XLOOKUP(E2,A2:A100,B2:B100)

找不到时显示“未找到”
=XLOOKUP(E2,A2:A100,B2:B100,"未找到")

向左查找:姓名在编号左边
=XLOOKUP(E2,B2:B100,A2:A100)

一次返回姓名、部门两列
=XLOOKUP(E2,A2:A100,B2:C100)

取最后一条匹配记录
=XLOOKUP(E2,A2:A100,B2:B100,"",0,-1)

通配符:包含“旗舰”的产品
=XLOOKUP("*旗舰*",B2:B100,C2:C100,"未找到",2)

二维查找

假设 A2:A10 是产品,B1:M1 是月份,B2:M10 是数据:

=XLOOKUP("A 产品",A2:A10,XLOOKUP("2026-01",B1:M1,B2:M10))

内层先按月份从二维区域里取出一列,外层再按产品从这一列里取一个值。两个方向的查找区域要能对应上,否则返回 #VALUE!。

区间匹配

分数段表按 0、60、80、90 升序排列:

=XLOOKUP(A2,$F$2:$G$5,2,-1)

-1 表示精确匹配,找不到时取下一个较小值。A2 是 75 时,会落到 60 这一档。查找区域必须升序,否则结果不可靠。

易错点

相关条目

参考链接

读完自测

合上页面,先回答,再展开对照。

  1. XLOOKUP 的 match_mode 为 -1 时返回什么?
  2. 为什么 search_mode=2 在未排序的数据上可能出错?
  3. 想返回编号左边的姓名,XLOOKUP 应该怎么写?
答案
  1. 精确匹配;找不到时取下一个较小值,查找区域需要升序。
  2. 二分查找依赖排序,数据未排序时定位方向会错,结果不可靠。
  3. 把姓名列作为 return_array、编号列作为 lookup_array,例如 =XLOOKUP(E2,B2:B100,A2:A100)。
微信小程序码:扫码打开命令速查小程序

小程序版

微信扫码,随时查命令