上一篇里 IF 让单元格学会了自己判断。这篇要解决的是一类更常见的加班来源:算完一个数之前,先得去另一张表里把对应的信息找出来。
场景几乎每个用 Excel 的人都会碰到。明细表里只有客户的编号或工号,客户名称、所属部门、单价这些信息躺在另一张对照表里。以前的做法是两边各自排一次序,对齐了再复制粘贴,下次数据一变,全部重来。XLOOKUP 干的就是这件事:给一个“钥匙”值,去另一张表里找出这一行,然后把你要的那一列取过来。
四个位置分别填什么
结构是:
=XLOOKUP(要找什么, 到哪一列里找, 找到了取哪一列的值, 找不到时显示什么)
假设明细表 A 列是工号,花名册的 A 列也是工号、C 列是部门。在明细表 D2 里写:
=XLOOKUP(A2, 花名册!$A$2:$A$100, 花名册!$C$2:$C$100, "查无此工号")
读法是:拿 A2 这个工号,去花名册的 A2:A100 里逐行比对;找到之后,回到同一行,取 C 列里的值;一个都没找到,就显示“查无此工号”。
三个需要说清楚的地方:
第二、第三个参数是“两列”,不是两个单元格。 XLOOKUP 先在第二个区域里找到位置(第几行),再到第三个区域里取同一行的值 1。所以两个区域必须从同一行开始、长度也一样。长度不一致时 Excel 通常会直接报 #VALUE!;真正难发现的是长度相同、只差一个起始行的情况——公式不报错,取回来的却是邻行的数据。
它不关心想取的列在左边还是右边。 老函数 VLOOKUP 只能指定“从这块区域的左边数第几列”,所以想取的列必须在查找列的右侧;XLOOKUP 直接给一整列,左右都行 1。这一条是很多人从 VLOOKUP 换过来的主要原因。
默认要求两边完全相等。 不额外指定的话,XLOOKUP 用的是精确匹配 1,工号必须一模一样才算找到。
取不到时显示什么
不写第四个参数,没找到就显示 #N/A 1。
#N/A 是错误值,但它的含义很明确:“这张表里没有这一条”。满屏 #N/A 时,第一件该做的事不是重写公式,而是确认这些工号是不是真的不在对照表里——新旧员工交替、客户编号改版,都会造成这种情况。
写了第四个参数,没找到就换成你给的内容。但这里有个特别容易踩空的地方:
第四个参数只管“没找到”,不管“找到了、但那一格是空的”。 如果工号匹配成功,而返回列对应的那一格恰好没填内容,XLOOKUP 会显示 0,你写在第四参数里的话根本不会出现 2。这和 IF 里“空单元格被当成 0”是同一类麻烦:屏幕上那个 0 很容易被当成“数量是零”,混进后面的求和里,把合计算歪。
想让两种情况都显示空白,最常见的办法是给整个结果接一个空文本:=XLOOKUP(...)&"" 3。但要留意副作用:&"" 会把数字结果也变成文本,看起来还是 123,实际已经是文本了,后续对这一列求和时 SUM 会把它跳过,合计就少算。所以要么等确认不需要再运算时再加,要么写成 =IF(XLOOKUP(...)="","",XLOOKUP(...)),把公式重复写一遍。XLOOKUP 本身没有直接参数能区分“没找到”和“找到但是空的”,这是它和 IFERROR 一样需要留心的边界。
拖到整列时,哪些引用要锁
公式要往下拖,第一行问 A2,第二行就得问 A3——第一个参数保持相对引用,让它跟着走。但后面两个区域必须钉死:
=XLOOKUP(A2, 花名册!$A$2:$A$100, 花名册!$C$2:$C$100, "查无此工号")
不锁会怎样?拖到下一行时,两个区域会跟着整体下移一格,变成 花名册!A3:A101 对 花名册!C3:C101。查找范围和返回范围错开了,取回来的是邻居那行的数据。这个错误最难发现的地方在于它 不报错:结果看着都有值,只有拿着原始资料逐个核对才看得出来,而且最后一行还可能莫名冒出 #N/A。
跨工作表引用还要带上工作表名和感叹号,写成 花名册!$A$2:$A$100 这种形式,否则 Excel 会去当前表里找。
填好第一行以后,不必一行行拖,双击单元格右下角的小方块就能自动填到底。填完至少抽查三处:第一行、最后一行,以及你刻意留的一条“应该找不到”的行。
明明看到了,为什么返回 #N/A
很多 #N/A 不是公式写错,而是“看起来一样,在 Excel 眼里不一样”4:
- 一个是数字、一个是文本。 明细表里的工号是导入来的文本“1001”,花名册里存的是数字 1001,两者不相等。用
ISNUMBER和ISTEXT分别看两边就能确认,必要时用 VALUE 把一侧转成数字。 - 藏着看不见的空格。 名字或编号末尾多一个空格、从网页复制来的不间断空格,肉眼完全看不出。可以用 TRIM、CLEAN 清洗,或比较两边的 LEN 长度。
- 区域起点不齐。 上面说的错位,表现常常是“有些行对、有些行不对”,而不是整列都错。
批量清洗留到后面专门讲。现在能用的判断规则是:如果某一项确实存在、两边看上去字字相同却报 #N/A,先怀疑类型和空格,而不是重写公式。
你的 Excel 里有这个函数吗
XLOOKUP 从 Excel 2021 和 Microsoft 365 开始提供,Excel 2019 和 2016 里没有。老版本打开带这个公式的文件会显示 #NAME?,意思是“不认识这个名字”5。碰到 #NAME?,先去“文件 → 账户”看版本;文件如果存成了老式的 .xls 格式,也可能报这个错 5。
没有 XLOOKUP 也能做同样的事,用 INDEX 配 MATCH 写:
=IFERROR(INDEX(花名册!$C$2:$C$100, MATCH(A2, 花名册!$A$2:$A$100, 0)), "查无此工号")
MATCH 找出 A2 在花名册 A2:A100 里排第几行,INDEX 按这个行号去 C2:C100 取同一行的值。思路和 XLOOKUP 完全一样,只是拆成两步、括号多一点。
写完检查四件事
- 第一个参数是相对引用,两个区域都用
$锁死,跨表写全了工作表名; - 查找区域和返回区域的起点、长度一致;
- 想过“匹配成功但那一格是空的”这种情况,知道它会返回 0;
- 第一行、最后一行、故意找不到的那一行,各看一遍。
最后数一下 #N/A 有几条,逐条确认是“记录真的不存在”,还是类型、空格造成的不相等。