
一篇覆盖入门到实战的 XLOOKUP 完整教程,告别 VLOOKUP 时代。
XLOOKUP 是 Microsoft 在 2019 年底推出、随 Microsoft 365 与 Excel 2021 正式普及的新一代查找函数。它用一个函数同时取代了 VLOOKUP、HLOOKUP、LOOKUP 以及常用的 INDEX+MATCH 组合。
为什么推荐用 XLOOKUP:
VLOOKUP 最易踩的近似匹配坑if_not_found 参数,告别嵌套 IFERROR=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 | ||
search_mode |
0 | #N/A 或 if_not_found |
-1 | |
1 | |
2 | *、?、~) |
1 | |
-1 | |
2 | 升序 |
-2 | 降序 |
💡 二分查找在超大数据集(上万行)下性能显著优于顺序查找,但前提是数据已正确排序,否则会返回错误结果。
=XLOOKUP(1003, A2:A5, B2:B5)返回:王五
VLOOKUP 无法向左查找,但 XLOOKUP 可以:
=XLOOKUP("李四", B2:B5, A2:A5)返回:1002
=XLOOKUP(9999, A2:A5, B2:B5, "未找到该员工")返回:未找到该员工
若数据按行排列,XLOOKUP 同样适用,只需把查找和返回范围改为行即可。
=XLOOKUP("Q3", B1:E1, B2:E2)一次返回姓名、部门、薪资:
=XLOOKUP(1002, A2:A5, B2:D5)返回:李四 | 销售部 | 12000(自动溢出到横向三个单元格)
⚠️ 注意:溢出目标单元格必须为空,否则会提示
#SPILL!错误。
设置 match_mode = 2,可使用 *(任意多字符)、?(单个字符)、~(转义):
=XLOOKUP("张*", B2:B5, C2:C5, "未找到", 2)返回:技术部
当存在重复值时,查找最新的一条记录(search_mode = -1):
=XLOOKUP("技术部", C2:C5, B2:B5, , , -1)返回:赵六(而非默认的 张三)
查找 82 分对应的等级(match_mode = -1 向下取最接近的较小值):
=XLOOKUP(82, A2:A5, B2:B5, , -1)返回:良好
通过连接符 & 实现多条件匹配:
=XLOOKUP("技术部"&"张三", C2:C5&B2:B5, D2:D5)根据"部门+姓名"返回对应薪资。
💡 多条件时建议中间用分隔符避免歧义,如
"技术部|张三"对应C2:C5&"|"&B2:B5。
嵌套两个 XLOOKUP 实现"既按行又按列"的查找,完全替代 INDEX+MATCH+MATCH:
=XLOOKUP("赵六", B2:B5, XLOOKUP("薪资", B1:D1, B2:D5))返回:18000
让 return_array 传入整表,结合布尔数组实现动态筛选:
=XLOOKUP(TRUE, (C2:C5="技术部")*(D2:D5>16000), B2:B5, "无匹配")返回首个"技术部且薪资>16000"的姓名:赵六
=XLOOKUP(A2, 员工信息!$A:$A, 员工信息!$D:$D, "查无此人")将 A2 的工号在另一张工作表中查薪资,未找到时提示"查无此人"。
=XLOOKUP(A2, '[工资表.xlsx]Sheet1'!$A:$A, '[工资表.xlsx]Sheet1'!$D:$D)⚠️ 关闭源工作簿后公式会显示完整路径,建议打开源文件或使用 Power Query 合并数据。
如果 lookup_value 本身是一个区域,XLOOKUP 会批量返回结果:
=XLOOKUP(F2:F10, A2:A100, D2:D100)一次性为 F2:F10 中的所有工号返回薪资,无需下拉填充。
查找"2024 年 1 月到 6 月"某销售员的总业绩:
=SUM(XLOOKUP("张三", A2:A100, B2:G100))返回该员工 BG 列(16 月)数据的总和。
=XLOOKUP(A2, 名单1!A:A, 名单1!B:B,
XLOOKUP(A2, 名单2!A:A, 名单2!B:B, "均未找到"))在"名单1"中找不到再去"名单2"找,避免 IFERROR(VLOOKUP(...), VLOOKUP(...)) 的冗长写法。
| XLOOKUP | |||
| 精确匹配 | |||
| 内置 if_not_found | |||
| 原生支持 | |||
| 动态数组溢出 | |||
| 低 | |||
| 高 |
结论:新版本 Excel 里,XLOOKUP 应当作为首选。
A:A 会让 Excel 扫描上百万行,改为 A2:A10000 或使用"表"(Ctrl+T)动态扩展范围。search_mode = 2 / -2 比顺序扫描快一个数量级。OFFSET、INDIRECT 搭配 XLOOKUP,会拖慢重算速度。#N/A | if_not_found 参数,或检查数据类型是否一致 | |
#VALUE! | ||
#SPILL! | ||
#REF! | ||
#NAME? |
最常见坑:文本型数字 vs 数值型数字
=XLOOKUP(VALUE(A2), 数据!A:A, 数据!B:B) // 查找值统一转数值
=XLOOKUP(A2&"", 数据!A:A, 数据!B:B) // 查找值统一转文本Q1:XLOOKUP 返回 #N/A?
检查查找值与查找列数据类型是否一致(例如文本型数字 vs 数值型数字),可用 VALUE() 或 TEXT() 统一格式;也可能是存在不可见空格,用 TRIM() 清理。
Q2:查找范围与返回范围必须同尺寸吗?
是的,两者行数或列数必须一致,否则返回 #VALUE!。
Q3:旧版本 Excel 能用吗?XLOOKUP 仅支持 Microsoft 365 与 Excel 2021 及以上版本,Excel 2019 及更早版本打开会显示 _xlfn.XLOOKUP,需改用 VLOOKUP 或 INDEX+MATCH。
Q4:WPS 支持吗?
WPS Office 2023 及以上版本已支持 XLOOKUP,老版本需升级。
Q5:XLOOKUP 和 FILTER 有什么区别?XLOOKUP 只返回第一个(或最后一个)匹配项,FILTER 返回所有匹配项。多结果场景用 FILTER,单值定位用 XLOOKUP。
Q6:查找值包含通配符字符本身怎么办?
使用 ~ 转义,例如查找真正的 * 就写 "~*",同时设置 match_mode = 2。
Q7:能否区分大小写?
XLOOKUP 默认不区分大小写。需要区分时可结合 EXACT:
=XLOOKUP(TRUE, EXACT(A2:A100, "Abc"), B2:B100)查找值 / 查找区域 / 返回区域match_mode 与 search_mode 解决区间查找、最新记录、二分查找& 拼接,二维查找用 XLOOKUP 嵌套 XLOOKUPif_not_found,告别冗长的 IFERROR 嵌套掌握 XLOOKUP,你的表格效率将提升一个量级。下一步可以继续学习 FILTER、SORT、UNIQUE 等动态数组函数,组合起来威力更大。