需要按编号查姓名,但姓名在编号左边;需要一次返回多个字段;找不到时想显示“未找到”而不是 #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 从第一项到最后一项 |
| 值 | 含义 | 用途 |
|---|---|---|
0 |
精确匹配 | 日常查找 |
-1 |
精确匹配,找不到时取下一个较小值 | 分数段、税率档位(查找区域升序) |
1 |
精确匹配,找不到时取下一个较大值 | 区间下限(查找区域降序或按需要) |
2 |
通配符匹配 | *、?、~ |
| 值 | 含义 |
|---|---|
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 这一档。查找区域必须升序,否则结果不可靠。
XLOOKUP;共享文件前确认对方的版本,或者改用 INDEX/MATCH。lookup_array 与 return_array 的行数(或列数)必须对应,否则 #VALUE!。return_array 是多列时结果会向右溢出,右侧有内容就报 #SPILL!;清空溢出区域。search_mode=2/-2 要求排序,否则结果错误;日常用 1。match_mode=-1 取“下一个较小值”,1 取“下一个较大值”;区间表要按对应方向排序。match_mode=0 不支持 */?;要通配符写 2。#N/A:不写 if_not_found 就会保留错误;报表里通常写 "" 或 "未找到"。search_mode=-1。#SPILL!IFNA 处理未找到合上页面,先回答,再展开对照。
XLOOKUP 的 match_mode 为 -1 时返回什么?search_mode=2 在未排序的数据上可能出错?XLOOKUP 应该怎么写?return_array、编号列作为 lookup_array,例如 =XLOOKUP(E2,B2:B100,A2:A100)。
小程序版
微信扫码,随时查命令