表格里最常见的活,大概就是从一张表里把某条数据捞出来。VLOOKUP 陪了大家二十多年,XLOOKUP 接班也有几年了,可在 WPS 表格里,「到底能不能用 XLOOKUP」这个问题,至今还常有人问。

下面从 VLOOKUP 的四个参数讲到 XLOOKUP 的六个参数,把同一道题用两种写法各做一遍,再专门说清 WPS 里的支持情况、版本门槛,以及那几处和 Excel 不太一样的地方。中间插三个完整案例,最后接上 WPS 里几个趁手的函数,凑成一套完整的查找组合拳。

信息核验时点: 2026-10-16。WPS 官网 Windows 下载页当前列出的正式版是 32 位 12.1.0.29161、64 位 12.1.0.29158(Mac 12.1.29181、Linux 12.1.2.29183);XLOOKUP 及配套的动态数组能力随较新版本逐步放开,具体以官方更新日志为准


本文要点
  • 一句话定义:XLOOKUP 是微软 2019 年发布、用来接替 VLOOKUP 的新一代查找函数,共 6 个参数,前 3 个必填,查找区域和返回区域各自独立指定。
  • 核心结论:VLOOKUP 的 3 个天生限制(不能向左查、默认近似匹配、要手数列号),在 XLOOKUP 里全部不存在。多条件查找、反向搜索、一次返回多列,过去要写数组公式或者加辅助列,现在一行就能完成。WPS 桌面版在 2024 年正式支持 XLOOKUP,参数提示是中文的。
  • 适用场景:订单与商品表的价格匹配、员工信息反查、成绩与评级换算、跨表核对与数据清洗、按时间顺序取最新或最早的那条记录。
  • 短板 / 边界:Excel 2019 及更早版本、部分老版 WPS 都不支持 XLOOKUP;纯网页端和移动端的支持情况与桌面版并不一致;早期 WPS 版本返回多列要先框选结果区域再按 Ctrl + Shift + Enter,不等同于新版自动溢出;用 XLOOKUP 写的表发给版本不明的同事,可能整列变成 #NAME?。

入门:先把查找这件事想清楚

动手之前,有层认识值得先建立:查找不是「一个函数」,而是一类需求。需求分清楚了,才知道该用哪个工具。

表格里的查找,其实只有三类需求

日常说的「查找」,几乎都能归到下面三类。

按唯一标识精确取值。 拿商品编号找单价,拿工号找姓名,拿身份证号找联系电话。特点是查找值在表里唯一,要求结果准确,错一个都不行。这类占了日常查找的绝大多数,也是 VLOOKUP 和 XLOOKUP 的主战场。

按区间取值。 分数落在 60 到 70 之间算及格,销售额落在某个区间给对应的提成比例。特点是查找值不对应某一行,而是要落到某个档位上。这类用 VLOOKUP 的近似匹配能做,但更顺手的是 XLOOKUP 的第五参数。

模糊匹配取值。 只记得姓名的一部分、编号的前缀,得靠通配符去找。这类需求看着零碎,实际出现频率不低。

三类需求混在一起、用同一个函数硬套,写出来的公式往往又长又脆。先分清需求再挑工具,这三十秒能省后面不少返工。

VLOOKUP 的四个参数,哪一个最容易写错?

完整语法是这样:

=VLOOKUP(查找值, 表格区域, 列序号, [匹配模式])

翻译成人话就是「找什么、在哪儿找、返回第几列、怎么匹配」。四个参数里,第三和第四最容易出事。

查找值是要找的东西,比如一个商品编号、一个工号。表格区域是查找范围,这里有条硬规矩:查找值所在的那一列,必须是这个区域的第一列。列序号是「从区域第一列开始数,要返回的是第几列」,纯手工数出来的数字。匹配模式填 FALSE 或 0 表示精确匹配,填 TRUE 或 1 表示近似匹配,而它默认是近似匹配。

最后这点值得单独强调。很多人写 VLOOKUP 时习惯省略第四参数,看着公式短了,实际上等价于开启了近似匹配。在一列没有排序的数据上做近似匹配,函数会返回它「碰到」的某个值,不报错,也不提示,只悄悄给你一个错的答案。这类隐性错误,比干脆亮出 #N/A 危险得多。

一个真实场景:把单价匹配到订单表

拿最经典的场景举例。一张产品表,A 列是 SKU,B 列是产品名,C 列是单价;另一张订单表,每笔订单记录了 SKU 和数量,需要把单价填进去,再算金额。

订单表里第一个 SKU 在 B2,单价要填进 D2,公式是:

=VLOOKUP(B2, 产品表!$A$2:$C$4, 3, FALSE)

对照前面的参数看,三处细节值得留意。$A$2:$C$4 用了绝对引用,是为了往下填充时区域不动;3 是手工数出来的,因为区域里单价排在第 3 列;FALSE 明确要求精确匹配,不能省。

这样写没问题,但它有个隐性成本:那个「3」是硬的。哪天在产品和单价之间插一列类别,区域变成 A 到 D,第三列的含义就变了,公式仍然不报错,返回的却是另一个字段的值。整个表上所有指向这张表的 VLOOKUP,会在没有任何提示的情况下一起错掉。

稳妥一点的做法有两个。一是把区域写成具体的引用范围而不是整列,二是干脆换成 XLOOKUP,让返回区域自己跟着表结构走。

VLOOKUP 的三个天生限制

把前面说的问题收拢一下,限制集中在三条。

只能从左往右查。 查找列必须在区域第一列,所以「按姓名反查工号」这类需求直接做不了,只能靠 INDEX 配 MATCH 变通,或者干脆把表格列顺序调过来。

默认近似匹配。 第四参数省略就等于埋了一颗雷,必须每次记得显式写 FALSE 或 0。

要手数列号。 列号是人数的,会随表结构调整而失效,失效时还往往不报错。

这三条不是「用得不熟练」的问题,是函数设计本身的约束。也正因如此,才会有 XLOOKUP。

VLOOKUP 报错,分别是什么意思?

看到错误值时先别改公式,先读懂它在说什么。

错误值含义排查方向
#N/A精确匹配下没找到这个值确认值确实存在、清掉首尾空格、统一数据类型
#REF!列序号超出了区域的列数重新数一遍列,或者改成引用具体区域
#VALUE!参数类型不对列序号必须是大于等于 1 的整数,不能是文本
#NAME?有可能是公式名拼错或版本不支持检查有没有中文标点,以及当前版本是否支持所用函数
#SPILL!结果要铺开的区域被占用了清空落点区域的内容,或用 @ 符号只取第一个值

其中 #N/A 占了日常报错的绝大多数,而它背后的原因,往往不是公式写错,而是数据本身对不上。

四种「看起来一模一样却查不到」的情况

这类问题最耗时间,因为肉眼看不出差别。

文本型数字和数值型数字。 单元格左上角有个绿色小三角的,多半是文本型的「1002」,而查找表里存的是数值型的 1002,在函数看来这是完全不同的两个值。修法是用分列把那一列重新识别一次类型,或者在公式里做转换:查找值加 &"" 转文本,加 *1 或套 VALUE 转数值。

首尾空格和不可见字符。 从系统导出的数据经常混着这些东西,看着一样的两个字符串就是匹配不上。用 TRIM 去空格、用 CLEAN 去不可见字符,处理一遍再比对。

区域没锁。 第二参数写成相对引用,公式往下填充时区域跟着漂移,后面的行就跑出范围了。选中区域按 F4 换成绝对引用。

查找值确实不在区域的第一列。 这不是数据问题,是需求超出了 VLOOKUP 的能力范围,该换函数了。

动手之前,先做三件准备

这三件事花不了几分钟,却能挡掉后面八成以上的「查不到」。

给两张表各找一个钥匙列。 查找的本质是拿一把钥匙去开一把锁,两边的钥匙必须对得上。订单表靠 SKU 找到产品,员工表靠工号找到姓名,这些列就是钥匙。表里没有这样一列,先造一个出来。

确认两边的钥匙是同一个东西。 一边是「E002」这种带前缀的编码,一边是纯数字 2,长得不像,就等于两把不同的钥匙。要么统一格式,要么在公式里做转换。

确认钥匙在右侧那张表里唯一。 同一个编号出现两次,函数只会返回它碰到的第一条,第二条永远取不到,而且不报错,得你自己去查。快速检查的办法是用 =COUNTIF(A:A, A2) 数一遍,结果大于 1 的就是重复,筛出来看。

进阶:XLOOKUP 凭什么能顶替 VLOOKUP?

到这里,把六个常见需求用两种写法各做一遍,差异会非常直观。

XLOOKUP 的六个参数,先记住前三个

完整语法是:

=XLOOKUP(查找值, 查找数组, 返回数组, [未找到时返回值], [匹配模式], [搜索模式])

前三个必填,后三个可选。最简用法只需要三个参数:

=XLOOKUP(A2, B:B, C:C)

意思是在 B 列里找 A2 的值,返回 C 列同一行的内容。和 VLOOKUP 最大的结构差异就在这儿:VLOOKUP 给的是「一个区域加一个列号」,XLOOKUP 给的是「在哪一列找」和「返回哪一列」两个独立区域。这一个改动,同时消掉了前面说的两个错误来源——不用保证查找列在第一位,也不用数第几列。

后三个可选参数是它的加分项。未找到时返回值可以直接写自定义提示,替代外面包一层 IFERROR 的写法;匹配模式默认就是精确匹配,不用每次记得补参数;搜索模式能控制从上往下搜还是从下往上搜。

六个回合:同一道题,两种写法

回合需求VLOOKUP 的写法XLOOKUP 的写法
一按编号查姓名=VLOOKUP("E002", A2:D4, 2, FALSE)=XLOOKUP("E002", A2:A4, B2:B4)
二按姓名反查编号做不到,要改用 INDEX 配 MATCH=XLOOKUP("李四", B2:B4, A2:A4)
三找不到时给个友好提示=IFERROR(VLOOKUP("E004", A2:D4, 2, FALSE), "不存在")=XLOOKUP("E004", A2:A4, B2:B4, "不存在")
四中间插入一列之后列号不变但含义变了,结果悄悄错返回区域自动调整,结果仍然正确
五一次返回姓名和部门两列两个公式,各写一次=XLOOKUP("E002", A2:A4, B2:C4)
六查某员工最后一次打卡要靠 LOOKUP 的变通写法=XLOOKUP("E001", B2:B5, A2:A5, , , -1)

第一回合打平,后五个回合 XLOOKUP 都更省事。第四回合特别值得留意:它不是「写起来更短」,而是「结构变动时不会悄悄出错」,性质完全不同。

这里还牵出一个用 IFERROR 的习惯问题。IFERROR 会把所有错误都吞掉,包括区域写错这种真正需要暴露的错误,一律替换成「不存在」,问题就被盖住了。更稳妥的写法是 IFNA,它只处理 #N/A 一种情况,其他错误照常弹出来。用 XLOOKUP 就更省事,第四参数天然只管「找不到」,别的错误不受影响。

通配符匹配:名字只记得一半怎么办?

有个容易被忽略的细节:XLOOKUP 的匹配模式支持通配符,第五参数填 2 就是通配符匹配。

=XLOOKUP("张*", B2:B100, C2:C100, "查不到", 2)

星号代表任意多个字符,问号代表一个字符。名字只记得姓、编号只记得前缀,这一招很管用。不过要留意,通配符匹配返回的是第一个符合条件的记录,如果有多个人姓张,它只会给你第一个,未必是你要的那个。用这个模式之前,最好先确认匹配结果唯一。

三个可选参数,各自解决什么问题

把后面三个参数单独拆开看,定位会更清楚。

参数位置名称不填时的默认行为什么时候要填
第四未找到时返回值返回 #N/A希望显示成「无此人」这类友好提示
第五匹配模式0,精确匹配用通配符、做区间取值
第六搜索模式1,从上到下要取最后一次记录,或对大数据量追求查找速度

四个匹配模式取值分别是:0 精确匹配,-1 精确匹配但找不到就返回较小项,1 精确匹配但找不到就返回较大项,2 支持通配符。四个搜索模式取值是:1 从上到下,-1 从下到上,2 二分搜索且要求升序,-2 二分搜索且要求降序。

这份对照值得抄张便签贴在显示器边上,用几次就记住了。

多条件查找,拼接法和乘积法怎么选?

两张表要按两个条件匹配,这是高频需求,两种写法各有适用范围。

拼接法,把条件拼成一个组合键:

=XLOOKUP(A9&B9, $A$2:$A$5&$B$2:$B$5, $C$2:$E$5)

查找值和查找数组都用 & 拼起来,再看是否相等,适合条件都是文本的情况。有个坑要注意:如果两个条件在原表里各自都存在,但不在同一行,拼出来的组合在原表中根本不存在,会直接返回 #N/A。碰到这种情况别急着怀疑公式,回去核对是不是条件本来就不该同时成立。

乘积法,用逻辑判断再相乘:

=XLOOKUP(1, (A:A="华东")*(B:B="产品X"), C:C)

两个条件表达式各自产生 TRUE 或 FALSE,相乘之后,同时满足的得到 1,其余得到 0,然后在结果数组里找 1,返回对应的值。这种写法适合条件里带数值比较的场合,比如「区域是华东且金额大于 5000」,写成 (A:A="华东")*(B:B>5000) 就行。

两种写法各有脾气:拼接法对文本友好,乘积法对数据友好。实在分不清时,一个简单判断是看条件里有没有大于小于号,有就用乘积法。

近似匹配:区间评级和阶梯提成的正确姿势

按分数查等级、按销售额查提成比例,这类「落到某个区间就给某个结果」的需求,用一个参数就能解决。

=XLOOKUP(F3, $J$3:$J$6, $L$3:$L$6, 0, -1)

第五参数填 -1,含义是精确匹配,找不到就返回较小的那一项。拿它做分数评级正好:分数落在两个档位之间时,自动匹配到下面那个档。填 1 则相反,返回较大的那一项。

有一点要分清:这里的 -1 和第六参数的搜索模式是两回事。需要用到二分搜索(搜索模式填 2 或 -2)时,查找区域才必须按升序或降序排好;普通的精确匹配或较小项匹配,不要求事先排序。

反向搜索:怎么取「最后一次」的记录?

打卡记录、变更日志这类数据,同一个对象会出现多次,而你要的往往是最后那条。

=XLOOKUP(E3, C3:C12, B3:B12, , , -1)

第六参数填 -1,表示从下往上找。中间两个参数留空,是因为不需要自定义提示,也用默认的精确匹配。过去做这件事得靠 LOOKUP 那套不太好解释的变通写法,现在一个参数就够了。

动态数组:一个公式铺满一片区域

返回数组选了多列时,结果会自动向周边铺开,这叫溢出。

=XLOOKUP(A2, B:B, C:E)

写在一个格子里,C、D、E 三列的结果会自己填到右边去。如果你只想要第一个值,在公式前加个 @ 即可。反过来,要给这一整片溢出结果做后续计算,引用左上角单元格后在末尾加一个井号,比如 =SUM(F2#)。

用动态数组有三个坑要知道:溢出区域必须是空的,落点上有内容会报错;溢出区域里不能有合并单元格;整列引用配合溢出时计算量会明显变大,最好限定到实际数据范围。

跨表与跨工作簿,怎么写才不出错?

查找的引用范围往往不在同一张表上,甚至不在同一个文件里。

跨工作表的写法是在区域前加工作表名和感叹号,比如 =XLOOKUP(A2, 产品表!$A$2:$A$100, 产品表!$C$2:$C$100)。工作表名里带空格或特殊符号时,要用单引号包起来。这个写法在 XLOOKUP 里比 VLOOKUP 简洁得多,因为两个区域各自写清楚就行,不用再考虑哪一列排第一。

跨工作簿的写法会带上文件名,比如 =[价格表.xlsx]Sheet1!$A$2:$A$100。这里有个必须知道的机制:这种引用默认是外部链接,被引用的文件关掉之后,公式取不到值;文件被移动或改名,链接直接断掉,结果变成 #REF!。发给别人时,对方电脑上没有你那个价格表,一样取不到数。

要避开这类麻烦,稳妥的做法是:需要长期使用的对照数据,先复制到当前工作簿的一个独立工作表里再引用;只临时用一次的话,取完值就转成数值。

公式太慢,问题出在哪儿?

数据量上来之后,会明显感觉查找公式让文件变卡。原因通常是这三处。

整列引用。 A:A 看着省事,实际计算范围是整列一百多万行,哪怕你只有几千行数据。把区域限定到实际范围,比如 $A$2:$A$5000,速度差别非常明显。

大量 VLOOKUP 叠加。 几千行数据每行一个 VLOOKUP,每个都要在对照表里扫一遍,累计计算量很可观。改用 XLOOKUP 配合二分搜索能快不少:先把查找区域按升序排好,再把第六参数填 2。二分搜索的查找次数按对数增长,数据量越大优势越明显。

混进了易失性函数。 有些函数任何单元格一变动就会重算,比如 TODAY、OFFSET、INDIRECT。整列铺满这类公式,文件会一直处在计算状态。能用固定区域就别用 INDIRECT,能算一次存成数值就别让公式天天重算。

一个实用的判断方式:文件打开慢,随便改个格子就转圈,先去看有没有整列引用和易失性函数。

WPS 里到底能不能用 XLOOKUP?

这是很多人搜到这篇文章的原因。答案是可以,但有几个前提得知道。

答案是能,但要看清版本

WPS 桌面版对 XLOOKUP 的正式支持来得比 Excel 晚几年。官方 WPS 学堂在 2024 年 6 月 27 日发布了《更新!WPS 正式支持 XLOOKUP 函数》,配了基础查找、反向查找、多列查找、多条件查找、搜索模式、匹配模式六组实例,桌面版就是在那前后正式上线该函数的。往前翻,2024 年年中社区里还有「专业版为什么没有 XLOOKUP」的提问,可见那阵子支持还没铺开——所以网上若有人告诉你「WPS 早在 2021 年就支持 XLOOKUP」,多半是把 Excel 那边 Microsoft 365 的时间线错安到了 WPS 头上。

不过 WPS 官方现在的表述比较谨慎:表格较新版本已支持该函数,具体版本号以官方更新日志为准。这句话的意思很明确——功能是有的,但版本线要自己确认。

怎么快速确认自己的版本支不支持?

三种办法,从快到慢排。

直接试。 在任意单元格里敲 =XLOOKUP(,如果弹出函数提示和中文参数说明,就说明当前版本可用;连提示都不出现,基本可以判断版本偏旧。

查版本号。 点左上角的 WPS Office 进首页,右上角全局设置里选「关于」,第一行括号里的数字就是版本号。再对照官方更新日志,看这一版有没有包含该函数。WPS 的版本号编排本身就有一套规则,看不懂时可以读这篇 WPS 的版本号怎么这么乱?一文读懂其背后的规则。

查函数列表。 在「公式」选项卡里点插入函数,搜索框里输入 XLOOKUP,能搜到就说明支持,还能看到官方的参数说明和用法示例。

还有一条容易踩的线:旧版本不支持。Excel 这边,XLOOKUP 从 Excel 2021 和 Microsoft 365 开始提供,Excel 2019 及更早版本没有。WPS 这边虽然支持,但也是从某个版本往后才有的,几年前的老版本一样用不了。另外桌面版的支持最完整,纯网页端的在线表格和移动端的情况与桌面版并不一致,碰到这种情况,官方给的建议是用桌面版打开。

为什么同事发来的表,我打开是一片 #NAME??

这大概是最让人困惑的场景:对方在自己电脑上算得好好的,发过来整列变成 #NAME?。

原因基本是两个。一是函数名或标点在输入时出了错,比如用了中文的逗号、括号,或者函数名里多打了空格。中文输入法下这种情况特别常见,公式看着差不多,实际完全跑不起来。

二是对方的运行环境不支持这个函数。一份含 XLOOKUP 的文件落到不支持它的软件或版本上,函数无法被识别,就会报 #NAME?;在部分 Excel 版本里,你还会看到公式被写成带 _xlfn. 前缀的样子,那不是被篡改,而是软件在标记「这里有个我不认识的函数」。

对应的处理办法有三条。最直接的是升级到最新版;实在升不了,就把 XLOOKUP 换成 INDEX 配 MATCH,那句组合在所有版本里都能跑;如果只是要发一份「看结果」的表,最简单的做法是选中公式结果,用选择性粘贴转成数值再发,对方打开就是一串普通数字,不受版本影响。

想少踩这类坑,日常有个习惯值得养:给别人发文件之前,先想一下对方用什么软件、什么版本。不确定的场合,兼容性优先。

分身在外,WPS 和 Excel 的写法差在哪?

既然是跨软件用,把这几个差异记下来能省不少事。

函数名照打英文,参数提示是中文。 在中文版 WPS 和 Excel 里,输入时仍然是 XLOOKUP,只是参数提示会显示成「查找值」「查找数组」这样的中文,别被绕住。

分隔符用英文逗号。 参数之间必须是半角逗号,中文逗号会让公式直接报错。这一个错误,占新手报错里相当大的比例。

返回多列时的确认方式。 这是两版 WPS 之间真实存在的差异。早期版本里,返回多列需要先框选好结果要落的整片区域,输入公式后再按 Ctrl + Shift + Enter 以数组公式的形式确认;较新版本支持动态数组,输入后结果会自己溢出铺开,不用提前框选,也不用手动确认。如果你写了一条返回多列的公式,却只出来第一个值,说明当前版本走的是老逻辑,先框选区域再按 Ctrl + Shift + Enter 试试。

区域引用符号一致。 绝对引用、相对引用、混合引用三种写法在两个软件里完全通用,$A$2、$A2、A$2 的含义一字不差,学一次两边都能用。

兼容性排序。 三种写法里,INDEX 配 MATCH 的兼容面最广,从很老的版本到最新版都能跑;VLOOKUP 次之;XLOOKUP 最省事,对版本的要求也最高。

不支持 XLOOKUP 时,替代方案有哪些?

环境确定用不了 XLOOKUP,下面这几条路都能走通。

第一选择,INDEX 配 MATCH。 兼容性最好的查找组合,能力上接近 XLOOKUP 的基础用法。

=INDEX(产品表!$C$2:$C$100, MATCH(B2, 产品表!$A$2:$A$100, 0))

读法是「在 C 列里取第几行」,那个「第几行」由 MATCH 算出来:在 A 列里找 B2 的值,最后一个参数 0 表示精确匹配。好处是查找列和返回列完全独立,反向查找、向左查找都能做,也不用数列号。而且 MATCH 的这个 0,和 VLOOKUP 的 FALSE 一样,是必须显式写上的。

多条件时,INDEX 配 MATCH 也能做,但要按数组公式输入:

=INDEX($C$2:$C$100, MATCH(1, ($A$2:$A$100="华东")*($B$2:$B$100="产品X"), 0))

老版本要按 Ctrl + Shift + Enter 确认,新版本直接回车即可。

第二选择,SUMIFS 当查找用。 返回的是数值、且满足条件的记录唯一时,用 SUMIFS 反而更简洁:

=SUMIFS(产品表!$C$2:$C$100, 产品表!$A$2:$A$100, B2)

好处是所有版本都支持、写法短、天然精确匹配;局限是只能返回数值,返回文本就无能为力了。查价格、查数量、查金额这类场景,用起来很顺手。

第三选择,FILTER 筛选。 需要返回一整行或多条记录时,FILTER 比查找函数更自然:

=FILTER(产品表!$B$2:$E$100, 产品表!$A$2:$A$100=B2)

它同样依赖动态数组,对版本的要求和 XLOOKUP 差不多;但在支持的环境里,它是处理「一对多」返回最顺手的工具。

第四选择,做个辅助列。 最土但最稳的办法:在右侧加一列,用 & 把两个条件拼成组合键,然后对组合键做普通的 VLOOKUP。这个方法在没有动态数组的老版本上依然好使,代价是表里多了一列。

XLOOKUP、VLOOKUP、INDEX+MATCH,到底该选哪个?

不用纠结,按场景挑就行。

使用场景建议用的写法
自己的机器,版本较新XLOOKUP
需要反向查、多条件查、取最后一次记录XLOOKUP
一次要返回好几列XLOOKUP
文件要发给版本不明的同事INDEX 配 MATCH
对方还在用 Excel 2019 或更早INDEX 配 MATCH
只是简单地向右查一列VLOOKUP 也完全够用
返回值是数值且记录唯一SUMIFS 更简洁

一句话总结:能确定环境就上 XLOOKUP,不确定就退到 INDEX 配 MATCH。

实战:三个完整案例走一遍

光看语法容易忘,把三个真实场景从头做一遍,手感就有了。

案例一:给订单表补全商品信息

数据长这样。 产品表在 A 到 D 列,依次是 SKU、产品名、类别、单价;订单表在另一张工作表,A 列是订单号,B 列是 SKU,C 列是数量。需要把产品名、类别、单价都补进来,并算出金额。

做法。 订单表的 D2 写一条公式,一次取回三列:

=XLOOKUP(B2, 产品表!$A$2:$A$100, 产品表!$B$2:$D$100, "SKU 不存在")

因为返回数组选了 B 到 D 三列,结果会自动往右溢出到 E、F,一个公式搞定三列。金额列再写 =C2*F2 就行。

这里要留意三件事。 一是绝对引用不能省,否则往下填充时区域会漂移;二是返回数组的三列顺序必须和你想填的顺序一致,XLOOKUP 是照着返回区域的排列顺序铺开的,不会自己去认列名;三是「SKU 不存在」这个提示只在第一列显示,整行都没匹配上时,三列会一起显示提示。

案例二:按多条件核对两张表

数据长这样。 一张是应收表,按客户加月份记录应收金额;一张是实收表,同样两列加实收金额。需要逐行核对,把实收金额填到应收表旁边,对不上的标出来。

做法。 用拼接法,把客户名和月份拼成组合键:

=XLOOKUP(A2&B2, 实收表!$A$2:$A$500&实收表!$B$2:$B$500, 实收表!$C$2:$C$500, "无实收记录")

旁边再放一列算差额:=D2-C2。差额不为零的行,用条件格式标红,整块对账结果就成型了。

这个案例的关键,在于判断该用哪种多条件写法。 条件是客户名和月份,都是文本,用拼接法最自然;如果条件里带金额区间,就得换成乘积法。另外「无实收记录」这个自定义提示在这里很有用——它和「有记录但金额为零」是两回事,混在一起会看不出问题在哪儿。

案例三:从变更日志里取最新状态

数据长这样。 一张状态变更表,按时间顺序记录每张工单的状态变化,同一张工单会出现多次。需要做一张汇总表,列出每张工单的当前状态,也就是时间上最新那条。

做法。 用反向搜索:

=XLOOKUP(F2, 变更表!$B$2:$B$1000, 变更表!$C$2:$C$1000, "无记录", 0, -1)

第六参数填 -1,从下往上找,返回的就是最后出现的那个状态。前提是这张日志表本身按时间先后记录——日志是乱序的话,先按时间列排一遍序,再跑这条公式。

这个案例最容易做错的地方,是数据没排序就直接反着找。 反向搜索找的是「最后出现的那一条」,不是「时间最大的那一条」。这两者在日志有序时是一回事,日志无序时完全是两码事。

高级:把 WPS 里几个趁手的函数接进来

XLOOKUP 解决的是「找到并取回」这一步。可真实的数据处理里,找到之前往往要先清洗,取回之后往往还要再加工。这几个环节,WPS 有几个用起来特别顺手的函数能接上——其中有的 Excel 至今没有同名工作表函数,有的(比如正则)Excel 也已在 2024 年补齐,只是入口和写法不同,下面会分别说清。

查找之前先清洗:REGEXP 把乱数据收拾干净

从系统导出的文本经常是「订单量 50 箱,单价 12.5 元」这种混排格式,直接拿去查找多半匹配不上。WPS 在 2024 年 4 月正式加入了正则表达式函数 REGEXP,一个函数靠「匹配模式」参数就能切提取、判断、替换三种用法,专门处理这类不规则文本。需要说清的是,「WPS 有正则、Excel 没有」这个说法到现在已经过时:微软在 2024 年 8 月给 Excel 365 测试通道陆续加入了 REGEXTEST、REGEXEXTRACT、REGEXREPLACE 三个函数,只是拆成了三个、且稳定版铺开的时间更晚。所以对不上的是写法,不是谁有此能力谁没有。

提取文本里的数字:

=REGEXP(A2, "[0-9.]+")

[0-9.]+ 表示连续的整数或小数。取出来的是文本,乘个 1 就能转成数值继续算。把提取和求和串起来,一行就能算出单元格里所有金额的合计:

=SUM(REGEXP(A2, "[0-9.]+") * 1)

常见的几种规则记下来就够用了:[一-龟]+ 匹配连续汉字,[A-z]+ 匹配连续字母,\d+\.?\d* 匹配带小数的数字。函数还有判断模式(返回真或假)和替换模式,手机号脱敏、卡号分段这类需求也能顺手做掉。

清洗归清洗,有个顺序上的提醒:先用 REGEXP 把数据理顺,再交给 XLOOKUP 去匹配。反过来做,你会花大量时间去排查「明明看着一样为什么查不到」,而问题根本不在查找函数上。

取回之后再加工:多重替换与文本算式

两列对照着批量替换关键词,用 SUBSTITUTES,它的特点是第二、第三参数都支持一组值,可以一次替换多种字符,而不是一次一个。把一批没用的字符一次清掉,比反复跑查找替换快得多。

还有一个在 WPS 里能直接当工作表函数用的 EVALUATE,能把写着算式的文本直接算出结果。单元格里是 3+5*2,=EVALUATE(A1) 返回 13。做报价单、工程量计算这类表时,让用户按自己的方式写算式、由函数算结果,比事先设计一堆字段灵活。要说明的是,EVALUATE 并非 WPS 从无到有的发明——Excel 早就有它,只是把它藏在早期宏表(XLM 函数)里,不能像普通公式那样直接在单元格里敲;WPS 的差异在于让它「下场」成了可直接使用的工作表函数,所以对日常做表的人来说,它约等于 WPS 才顺手能用。

取回来的数据,怎么呈现更好?

取回来的数据,光算对还不够,还得让人一眼看懂,这时就轮到图表和视图上场。WPS 表格近一版确实补了一批高阶图表,官方更新帖点名可查的有箱型图、瀑布图、旭日图、树状图等,做分布、成本流转、占比构成这类分析比老一套柱状图省事得多。

有两点得掰开说清,别让功能名字误导你。一是常被写成「WPS 数据工作台(WPS Query)」的那套东西,其实是数据选项卡下的取数与清洗编辑器(业内叫 ETL/Power Query 那一类),并不是某一次表格更新里「一键上线」的新按钮,它长期处于灰度放量状态,你机器上有没有这个入口、入口叫什么,得自己去数据 → 获取数据里确认,别照着文章假设它已经默认存在。二是「看板、甘特图、日历」这些视图属于WPS 多维表格,和前面讲的单元格函数、和普通工作表的图表不是一回事——多维表格是另一条产品线,别把它的视图能力当成「XLOOKUP 所在这个表」就能用的东西。至于网上流传的「某个版本号一口气给表格加了七种高阶图表」这种精确到个位数的说法,官方口径只到「新增支持多种图表类型」,具体型号建议以你自己版本里的「插入图表」列表现查为准。

这件事和查找函数的关系是:函数负责把数据准确取出来、算对,图表和视图负责让它被看懂。一套流程里,前一步出错后一步全废,但也别只练前半段。

函数搞不定的批量活,交给脚本

有些活是函数的天花板。手头有几十份格式相同的工作簿,要把每份里的人员信息补全,或者核对两份表之间的差异,靠公式一个个文件打开复制,一天都做不完。这时候用一段 Python 脚本更划算。想先摸清 Office 与 WPS 各自的编程接口怎么选,可以看这篇横向对比;这里直接用 openpyxl 演示「建对照表、逐行取回」的思路。

# 先装好处理 Excel 的库
pip install openpyxl
from openpyxl import load_workbook

# 打开两份工作簿:一份人员表,一份订单表
staff_book = load_workbook("人员表.xlsx")
orders_book = load_workbook("订单表.xlsx")

staff = staff_book.active
orders = orders_book.active

# 先建立「工号 -> 姓名」的对照表,相当于一次 XLOOKUP 的查找数组
name_map = {}
for row in staff.iter_rows(min_row=2, values_only=True):
    emp_no, name = row[0], row[1]
    name_map[emp_no] = name

# 再遍历订单表,逐行把工号换成姓名
for row in orders.iter_rows(min_row=2, min_col=1, max_col=3):
    emp_no = row[0].value
    # 找不到时写「未找到」,对应 XLOOKUP 的第四参数
    row[2].value = name_map.get(emp_no, "未找到")

orders_book.save("订单表已匹配.xlsx")

脚本的思路和 XLOOKUP 其实是一回事:先建一张对照关系,再逐行取回。区别在于它能一次跑完几十个工作簿,而且过程可重复、结果可复现。脚本不替代表格,它只是在批量场景里替你把体力活接走。

排查清单:报错了按这个顺序查

公式不生效时,从上到下过一遍,九成问题能自己定位。

一条公式报错,先从哪一步查起?

第一步,看错误值是什么。 #N/A 是没找到,#NAME? 是函数名或版本有问题,#REF! 是引用失效,#VALUE! 是参数类型不对,#SPILL! 是溢出被挡住。不同的错误值指向完全不同的方向,别一上来就改公式。

第二步,检查标点。 逗号、括号、引号是不是半角。这一条看着幼稚,却确实是最常见的错误来源。

第三步,检查数据类型。 用 ISTEXT 或 ISNUMBER 看一眼查找值和查找列的类型是否一致。文本型数字和数值型数字对不上,是最隐蔽的一类原因。

第四步,检查有没有空格和不可见字符。 用 TRIM 和 CLEAN 处理一下再试。

第五步,检查区域引用。 该锁的($)锁了吗?范围是不是漏了行,或者多算了表头?

第六步,手工核验一个值。 挑一个明明确实存在的查找值,手工在对照表里搜一遍,确认它真的在那儿、真的只出现一次。

十个高频搭配速查

想解决的问题建议的组合
反向查找XLOOKUP,或 INDEX 配 MATCH
多条件查找XLOOKUP 拼接法,条件带比较时用乘积法
区间取值XLOOKUP 第五参数填 -1
取最后一次记录XLOOKUP 第六参数填 -1
一次取回多列XLOOKUP 返回数组选多列,或 FILTER
找不到时显示提示XLOOKUP 第四参数,或 IFNA 包一层
只记得关键词XLOOKUP 第五参数填 2 用通配符
返回唯一匹配的数值SUMIFS
返回多条记录FILTER
老版本上也要能跑INDEX 配 MATCH,或加辅助列做 VLOOKUP

学查找函数,最容易走进哪几个误区?

只学 VLOOKUP,觉得够用。 日常确实够用,可碰到反向查找、多条件查找、取最后一次记录,就只能靠变通写法硬凑,公式越来越长,也没人看得懂。学会 XLOOKUP 的成本其实很低,它的参数设计比 VLOOKUP 更直观。

忘了第四参数。 VLOOKUP 的匹配模式默认是近似匹配,省略不写就是一个隐性错误源。要么老实写上 FALSE,要么直接换 XLOOKUP,它默认就是精确匹配。

把列号写死在公式里。 这是最隐蔽的一类错误,因为它不报错。表结构一改,结果就悄悄错了。换成 XLOOKUP 的返回区域写法,或者至少把区域改成引用具体范围而不是整列,能让这类问题不再出现。

用 IFERROR 把所有错误都藏起来。 IFERROR 会把区域写错这类真正需要暴露的错误一起吞掉,替换成一句「未找到」,等于给问题盖了层布。要屏蔽,优先用 IFNA,它只管 #N/A 这一种。

忽略数据类型。 查不到的原因里,文本型数字和数值型数字对不上占了很大比重。排查这类问题记住两件事:看单元格有没有绿色小三角,用 ISTEXT 或 ISNUMBER 确认类型。

不考虑收件人的版本。 自己用着新版本很顺手,发出去整列 #NAME?,反而耽误事。发文件前想一下对方的软件环境,不确定就用兼容性最好的写法。

忽略钥匙的唯一性。 只关心公式写没写对,不关心对照表里同一个键出现了几次。重复的钥匙不会报错,只会安静地给你一个不完整的结果,这类错误比报错更难发现。

从 VLOOKUP 到 XLOOKUP,大概要花多久?

按多数人的节奏,可以这样估。

半天:把 VLOOKUP 的四个参数、三个天生限制和常见报错弄明白,重点是记住第四参数不能省、区域要锁定、数据类型要对上。

一到两天:掌握 XLOOKUP 的前四个参数,能把手上现有的 VLOOKUP 公式改写成 XLOOKUP,反向查找和多列返回这两个场景立刻能用起来。

一周左右:学会第五、第六两个参数,多条件查找的两种写法、区间评级、取最后一次记录都能应付,也清楚动态数组溢出的机制和 @、井号两个符号的作用,会自己判断「环境支不支持」。

长期:养成按场景选函数的习惯。先判断环境能不能用 XLOOKUP,再判断需不需要多条件或反向查,最后才决定写哪一条公式。真正拉开差距的不是会几个函数,而是拿到一份数据时,知道第一步该做什么、哪个环节容易出错。

查找函数这个主题,其实是个很好的切入点:它同时涉及公式语法、数据结构和版本兼容三件事。如果你刚接触 WPS 表格,建议先照着 WPS 表格从入门到精通:一份完整的学习路径指南(2026 版) 把界面、数据类型和基础公式过一遍,再回来练这篇的查找组合拳,会顺得多。把这三件事理顺,你对整张表的理解会明显不一样。下次再碰到「查不到」的时候,先别急着改公式,花十秒看一眼数据类型和环境版本,多半就找到答案了。

发表评论

验证码图片,点击可更换