版本对照:新函数在老 Excel 里怎么办
一个函数能不能用,先看版本再说

写过公式的人多半遇到过这个场景:你在自己电脑上写得好好的 =XLOOKUP(A2,C:C,D:D,"无"),发给同事打开一看,满屏 #NAME?。不是你写错了,是对方的 Excel 版本里根本没有这个函数。函数不是语言自带的语法,而是软件版本决定的功能集,这件事在讲新函数之前必须先认下来。
同事要用上的函数最常见的一个是 XLOOKUP,最低要求是 Microsoft 365 或 Excel 2021;动态数组那一族(UNIQUE、FILTER、SORT、SEQUENCE)同样是 365 或 2021 才有;TEXTJOIN 和 IFS 松一些,Excel 2019 就内置了;至于 LET 与 LAMBDA,又是 365 或 Excel 2024 的门槛。WPS 这几年追赶得很快,新版 WPS 表格已经支持 XLOOKUP、UNIQUE、FILTER 和 TEXTJOIN,但 LAMBDA 仍不稳定。所以他打不开你的公式,往往不是版本故意作对,而是双方手上的软件确实差着几年。
| 函数 | 最低支持版本 | WPS 支持情况 | 判断办法 |
|---|---|---|---|
=TEXTJOIN("-",TRUE,A2:C2) |
Excel 2019 | 支持 | 输入后看是否有参数提示 |
=IFS(A2>90,"优",A2>75,"良") |
Excel 2019 | 支持 | 单元格输入函数名看是否报错 |
=UNIQUE(A2:A500) |
Excel 2021 / 365 | 新版支持 | 输入后是否自动溢出 |
=XLOOKUP(A2,C:C,D:D,"无") |
Excel 2021 / 365 | 新版支持 | 不是 #NAME? 即可用 |
=LET(x,A2*10,x+B2) |
Excel 2024 / 365 | 不稳定 | 慎用,见 LET 那篇的提醒 |
=LAMBDA(a,b,a*b) |
Excel 2024 / 365 | 不支持 | 绝大多数环境不可用 |
最稳妥的判断办法不是查表,而是让对方在一个空白单元格里直接输入函数名。比如输入 =XLOOKUP( 之后若屏幕上弹出参数提示框,说明此函数在本机上可用;若回车后显示 #NAME?,就是版本不支持。这个十秒钟的自查,比事后整张表花式报错再回头排查省事得多。判断一次还不够,因为同一家公司里不同电脑的更新进度可能差半年,发给三个人就要确认三次。
没有动态数组的老版本,去重和筛选怎么做
新版里一行 =UNIQUE(A2:A500) 就能去重,老版本只能绕路。最直接的路是菜单操作:选中数据列,点数据选项卡里的删除重复项,几秒钟出结果。缺点也明显——它是菜单动作不是公式,源数据更新之后结果不会跟着变,你得重跑一次。如果只是偶尔出一次清单,这条路完全够用。
需要结果跟着数据变的时候,老版本的经典做法是辅助列加条件计数。假设 A 列是原始名单,在 B2 写 =IF(COUNTIF($A$2:A2,A2)=1,"保留","") 然后向下填充。这条公式的巧妙之处在于 COUNTIF 的区域是半开放的:第一行锁住 $A$2,第二行跟着扩展,于是它统计的是当前这个名字在它及以前出现过几次。只有第一次出现的那行得到保留,后续重复的都留空。最后用自动筛选筛出保留的行复制走即可。
筛选的替代方案是高级筛选。数据选项卡的排序和筛选组里,高级按钮可以把符合多条件的整行原样复制到别的位置,功能上接近FILTER。但高级筛选的条件区域要单独画一块,写法是字段名在上、条件在下,* 通配任意字符、<> 表示不等于。操作难度属于那种用过三次就熟、半年不用就忘的类型。若每个月固定要出同一张清单,可考虑把数据导入 Power Query 做一次清洗再加载,那样源数据更新后刷新一次即可,属于长期方案。
去重还有一个被遗忘的老办法:数据透视表。把字段拖到行区域,透视表天然只列唯一值,还附带计数。适合既要去重又要顺便看出现次数的场景,成本几乎为零。
XLOOKUP 在老版本里怎么替代
XLOOKUP 最大的便利是默认精确匹配、找不到能自定义提示、还能向左查找。老版本里要凑齐这三件事,标准答案是 INDEX 加 MATCH:=INDEX(D:D,MATCH(A2,C:C,0))。MATCH 的第三参数写 0 表示精确匹配,位置交给 INDEX 取列。这套组合在进阶查找里讲过细节,它比 VLOOKUP 自由的地方就是不限制查找列在左边还是右边。
自定义找不到的提示,外面套一层 IFERROR 即可:=IFERROR(INDEX(D:D,MATCH(A2,C:C,0)),"无"),效果约等于 XLOOKUP 的第四参数。性能上 INDEX 加 MATCH 还略占便宜,在大表上查找速度稳定,所以即便你电脑上有 XLOOKUP,发给老版本同事的文件用这套组合反而更保险。
需要向左查找时很多人会先想到 VLOOKUP 加 IF 构造虚拟数组的写法,那属于刻意炫技:=VLOOKUP(A2,IF({1,0},C:C,D:D),2,0) 既难懂又慢。INDEX 加 MATCH 才是老版本的正解,简单、快、好交接。顺带一提,新版里直接写 =XLOOKUP(A2,C:C,D:D),C:C 在前 D:D 在后,语义比 INDEX 加 MATCH 直白得多,这也是新函数值得升级的原因。
TEXTSPLIT 没有了,文本怎么拆
TEXTSPLIT 是 2021 才有的函数,一句 =TEXTSPLIT(A2,"-") 把字符串按分隔符拆成多列。老版本对应的是菜单操作:选中列,点数据里的分列,按分隔符号一步步走。分列的缺点同样是不可重复:源数据一变就要重跑,而且会覆盖右侧列,用之前务必空出足够列数。它的优势是带可视化预览,处理一次性数据迁移任务时非常直观。
公式化的老办法是 LEFT、RIGHT、MID 配合 FIND:=MID(A2,FIND("-",A2)+1,LEN(A2))。这类写法的展开思路在文本截取与拼接里有完整演示。难点在于分隔符位置不固定时公式会越写越长,超过两层嵌套就建议放弃了。合并的情况好一些:Excel 2019 起就有 TEXTJOIN,=TEXTJOIN("-",TRUE,A2:C2) 可以直接用;再老的版本只能写 =A2&"-"&B2&"-"&C2 这种连字符堆叠,三五个字段还能忍,字段一多换行都看不清。
老版本还有一个隐藏选项:Power Query 的拆分列。它把分列操作变成可刷新的步骤,源数据更新后一键刷新即可,比公式和菜单都更适合长期使用的表格。代价是要学一套新界面,对只做一次性任务的人来说不划算。
LET 和 LAMBDA 的老版本替代
LET 解决的是长公式里反复写同一段表达式的问题,老版本的替代品是命名公式:把那段公共计算定义成一个名称,公式里引用名称即可。这个做法在名称管理器里详细讲过,缺点是名称散落在管理器里,看公式时要点开名称才知道在算什么,可读性比 LET 差一档。
LAMBDA 能自定义函数,老版本没有对等物,最接近的是带参数的宏或者直接写一串嵌套公式分发到多个单元格。现实做法是把业务规则写成一段公式存在模板里,改成参数化形式:把可变输入集中放在表头几个格子里,公式里绝对引用它们。虽然没有函数名,复用效果接近。
对新版本独有的能力,老版本有一条通用退路:把新函数实现的逻辑用基础函数重写。比如 SORT 可以用排序加辅助排名列模拟,SEQUENCE 可以用 ROW 函数下拉模拟,FILTER 可以用自动筛选或高级筛选模拟。只要接受手动刷新这个代价,几乎所有新函数都能找到老版本解法,差别只在自动化程度。如果一定要保留新函数又想让老版本打开不报错,可以在公式外再包一层 IFERROR 兜 #NAME?,但这只是掩盖错误,不如直接改写。
发文件之前的兼容性自查
养成一个习惯:文件发出之前按对方版本检查一遍。第一步问清楚对方用的是 Excel 还是 WPS、哪个年份的版本;第二步打开文件选项里的兼容性检查器跑一遍,它会列出当前工作簿里所有老版本不认的内容;第三步把关键公式用基础函数重写一遍做对照,确认两套写法结果一致。做完这三步再发,双方都省事。
模板类的文件标准更高。模板是要长期复用、到处分发的,原则上不应该出现任何新版本独占函数。用 INDEX 加 MATCH 而不是 XLOOKUP,用辅助列而不是 UNIQUE,看起来土,但能让模板在每一台电脑上都跑得起来。真正想用新函数又怕兼容问题,可以准备两个版本:一个全功能的自己用,一个降级版发给外部。维护两份文件当然累,可是比起对方打开全是 #NAME? 还要来找你,这点维护成本不算什么。关于哪些函数最容易引发性能问题,易失函数与性能陷阱里有更细的拆解。
被版本差异坑过的三个真实场景
第一个场景是月末报表。财务同事用 365 写了一张自动汇总表,里面用了 FILTER 从明细表里捞当月数据。这套表在她电脑上跑得好好的,交给主管审核时打开一片 #VALUE!,因为主管的电脑是 Excel 2016。主管以为是数据坏了,让重做,来回折腾了两天。真正的原因只是主管电脑上没有动态数组,FILTER 返回的是一片值,但在不支持溢出引用的版本里它只取第一个格子的结果,进而带动后续公式全部错位。这个坑的教训是:对外提交的文件一定要按最低配置那台电脑来写。
第二个场景是人员名册。人事用 UNIQUE 做了一份在职人员唯一名单,交给 IT 部门导入系统。IT 那边的电脑是 WPS 老版本,没有 UNIQUE,打开文件后公式全变 #NAME?,导入程序读到的是一堆错误值。解决办法不复杂,把公式结果复制一份成数值即可,但当时没人想到,白白耽误了一上午。凡是结果要交给别的系统消费的表,最后一步都应该把公式转成数值,既能避开版本问题,也能避开导入时的公式解析问题。
第三个场景是模板分发。一套费用报销模板用 XLOOKUP 做了自动带出部门和预算余额的功能,发给十个部门填写,其中六个部门的电脑版本不够新,打开后带出功能全失效,员工只能手填,数据质量反而比不用模板更差。这件事说明一件事:模板的兼容标准不能按自己的电脑定,要按使用范围里最旧的那台电脑定。以后再做模板,先在最低配置环境里跑一遍,能跑通再发。
给文件分层的三个原则

从这些教训里能总结出三条可执行的原则。第一条,区分自用文件和外发文件。自用文件放开写,新函数用得越狠效率越高;外发文件一律降级到基础函数。两者不要混在一个文件里,因为改来改去容易忘记自己是写给谁用的。
第二条,公式层和数据层分开。公式层是全功能版,只有自己维护;数据层是公式算完后复制成的数值,发给任何人都不会出错。维护时更新公式层,分发时导出数据层,这套二层结构能同时解决兼容性、性能和数据泄漏三类问题。具体做法是另存一个副本,把公式区域选中复制,再用选择性粘贴里的数值覆盖。
第三条,加一个自查格。在文件显眼位置留一个单元格,写一条版本检测公式,比如 =IFERROR(UNIQUE(A2:A3),"本机版本不支持动态数组"),打开文件的人一眼能看到自己的环境是否达标。这个设计看起来多余,实际能省掉大量往返沟通:对方一打开就知道问题出在版本上,而不是怀疑文件损坏。做对外模板时特别值得加。
升级的判断:值不值得为几个函数换软件
有人会问,为了用几个新函数升级整个 Office 值不值得。答案取决于你每月做表的时间。如果你每周花几小时在重复的整理、去重、筛数据上,动态数组和 XLOOKUP 能把这些时间压掉一大半,升级的钱和折腾成本几个月就收回来了。如果你一个月才碰两三次表格,老版本的手工操作完全够用,没必要为偶尔的需求改环境。
另一个判断维度是协作对象。如果你的文件主要在公司内部流转,而公司统一了版本,那升级收益很小。如果你经常需要把文件发给客户、供应商、外部机构,那兼容性的顾虑会一直存在,这时候与其纠结升级,不如把力气花在写兼容公式和把结果转成数值上。工具选型永远服务于协作场景,不是越新越好。
常见问题
怎么快速知道一台电脑支持哪些函数
在空白单元格里输入函数名加左括号,看是否弹出参数提示。弹出了就支持,显示 #NAME? 就不支持。批量确认可以用 =FORMULATEXT() 把一批函数名写成一列再逐个测试。也可以在文件选项里查看启用编辑后的后台兼容信息。另外一个旁证是云协作:能打开在线版 Excel 的账号通常是最新的函数集,打开网页版试一下就知道这个函数大致是不是新东西。
同事发来的文件里公式变成了怪样子
如果对方用的是更老的版本,而你用了新函数,文件在他那边会显示 #NAME?,重新保存再传回来时这些公式可能被彻底替换成错误值。这是不可逆的,所以收到带 #NAME? 的文件,第一步是先备份再操作。反过来如果你这边版本新,打开老文件一般没有问题,Excel 会保留原有公式不主动升级。养成备份再另存的习惯,比任何数据恢复工具都可靠。
WPS 用户能用 XLOOKUP 吗
WPS 表格较新版本已经支持 XLOOKUP 和 UNIQUE、FILTER、TEXTJOIN,但 LET 与 LAMBDA 支持不稳定,建议不用。跨软件分享文件时,优先选择两边都有的函数,INDEX 加 MATCH、SUMIFS、TEXTJOIN 是已知安全的交集。WPS 对部分函数的参数做了一些本地化适配,比如中文函数名,混合使用时要注意这一点。
老版本打开新文件卡顿是怎么回事
一般不是兼容问题,而是文件里积累了大量易失函数或条件格式规则。OFFSET、INDIRECT 这类函数在任何版本上都会拖慢速度,和版本新旧无关。先看性能那篇的内容排查一遍,再考虑版本因素。另一个常见原因是文件里存了大量未使用的命名区域和样式,清理之后体积和速度都会改善。
模板必须兼容到多老的版本
看使用对象。只在公司内部用,兼容到公司最低配置即可,通常 Office 2016 是底线。发给外部客户或长期模板,建议兼容到 2013 甚至更早,那时几个关键新函数都还没有。不确定的时候,用基础函数写一遍永远是最保险的选择,哪怕公式长一些。
