夜雨聆风学习资料网

ARTICLE · 1196010

WPS 里公式算出来的数不对,却一个错都不报:这 3 个静默错误,比 #NAME? 难发现得多

WPS 里公式算出来的数不对,却一个错都不报:这 3 个静默错误,比 #NAME? 难发现得多

在 WPS 里用公式的人,先看这 3 个坑(附 2 个实测能用的替代公式)。

公式出错分两种:一种是 #NAME? 直接蹦出来,你知道错了;另一种是一个错都不报,公式还你一个看起来完全正常的数字。

第二种才坑人。你以为算对了,直接把表报给老板。

下面这 3 个坑,都是我在本机 WPS 12.0 里一个个敲出来的,Excel 那边的预期值也标了,方便你对照自己机器的情况。

赶时间的话,直接拉到文末,找到「只记住这 3 个」那张表,照着改。

看之前先说清楚版本,不然你一测结果不一样,会以为我写错了:

· 本文按 Windows 版 WPS 12.0(Build 29161)实测,Excel 预期值按微软官方函数定义写。

· WPS 更新比较勤,函数支持情况可能变。你要是测出不同结果,先看版本号,文末有核对方法。

· 下面说的「不报错」特指 WPS 里的表现;Excel 对这些情况多数会直接报错或给提示。

一、先分清两类错误,这篇只讲第二类

报错型不用管,软件会喊你。今天只讲第二类。

类型

长什么样

会不会知道

报错型

#NAME?、#VALUE!、#DIV/0!

一定会知道。单元格右上角有绿色三角,眼睛能看到。

静默型

没有任何提示,就是一个数

永远不会知道,除非拿结果跟手工算的比一遍。

静默型危险在哪:一张汇总表用了 3 处这种公式,汇总数字是错的,表格却「看起来完全正常」——没红字、没警告、没绿色三角。你只会觉得「这数据算出来就是这样」。

最容易出事的场合:从外部拷进来的表。别人给的 xlsx、WPS 导出的 CSV、系统导出的报表,格式转换最容易把全角符号、编码、函数版本搅乱。

配图位:三种错误对比图(报错型 vs 静默型 vs 溢出丢失)——发布前补一张实拍截图,左中右三个单元格分别显示 #NAME?、正常数字但值错、#SPILL!。

二、坑 1:TEXTBEFORE 的第 3 个参数是坏的

拿「张三-男-28」举例,想取中间的「男」。

TEXTBEFORE 是 Excel 2022 开始的新函数,WPS 也支持,作用是取分隔符之前的文本。但它的第三个参数(instance_num,取第几个分隔符之前)在这版 WPS 上是坏的。

你在 WPS 里写的公式

WPS 返回

应该是

结果

=TEXTBEFORE("a-b-c","-",1)

a

a

✅ 对

=TEXTBEFORE("a-b-c","-",2)

a-b

b

❌ 错

=TEXTBEFORE("a-b-c","-",3)

报错

c

❌ 错

=TEXTAFTER("a-b-c","-",2)

c

b-c

❌ 错

规律很清楚:第一个分隔符是对的,第二个开始就崩了。

换组数据再测:=TEXTBEFORE("张三-男-28","-",2) 返回「张三-男」,应该是「男」。它返回的是「第 1 段+分隔符+第 2 段」,根本没处理第 3 参数。这个错还特别像回事——一段合法文本,格式也对,你根本不会怀疑。

什么时候会咬你

· 只写 TEXTBEFORE(文本,"-") 不带第 3 参数(取第 1 段),WPS 和 Excel 都对。

· 只要第 3 参数 ≠ 1,一定错。拆「张三-男-28」这种多段文本最容易踩。

这一类先记住:第 3 参数不等于 1,就别用 TEXTBEFORE。

解法:用老函数替代,已实测三段全对

不碰那个坏参数,用 SUBSTITUTE + REPT + MID,把分隔符替换成一大串空格,再按位置切:

=TRIM(MID(SUBSTITUTE($A$2,"-",REPT(" ",LEN($A$2))),(n-1)*LEN($A$2)+1,LEN($A$2)))

n 取 1/2/3,分别得「张三」「男」「28」,三段全对。第 4 段(不存在)返回空白,不会污染计算。

实操:文本在 A2,公式里固定文本换成 $A$2,拖填充时只改 n(1、2、3),三行拆完一列。

三、坑 2:动态数组函数不溢出,只吐第一个值

TEXTSPLIT、UNIQUE、SORT、FILTER、SEQUENCE 这一批,在 Excel 365 里会自动溢出、铺满相邻格子。在 WPS 里不溢出,只吐第一个值。

公式

WPS 实际结果

Excel 预期

=TEXTSPLIT("a,b,c",",")

A1=a,A2 空,A3 空

A1=a,A2=b,A3=c

=UNIQUE({1;1;2})

只有 1

1 和 2 两格

=SORT({3;1;2})

只有 1

1、2、3 三格

=SEQUENCE(3)

只有 1

1、2、3 三格

只返回第一个元素,剩下的丢了,不报错。

Excel 那边溢出区域被占,会给 #SPILL! 并在原格显示公式原文。WPS 连这个都没有——直接返回首值,你连提示都收不到。

为什么比报错难查:你写 =TEXTSPLIT(A2,",") 想把「张三,男,28」拆成三格,结果只有「张三」。汇总公式统计的是非空单元格,结果是「少了两行」,你会怀疑数据源,不会怀疑公式。

这一类先记住:别指望它铺开,用 INDEX 逐个取。

解法:外面套一层 INDEX,已实测

虽然不溢出,但数组本身在,INDEX 可以按序号取:

=INDEX(TEXTSPLIT("a,b,c",","),1) → a ✅

=INDEX(TEXTSPLIT("a,b,c",","),2) → b ✅

=INDEX(TEXTSPLIT("a,b,c",","),3) → c ✅

=INDEX(SORT({3;1;2}),1) → 1 ✅

拆三格就在相邻三格各写一个,序号分别 1、2、3。

什么时候用哪个:

· 只要第 n 个值(比如只要中间那段年龄)→ INDEX(函数(…),n),一行搞定。

· 要铺满整列(把一列逗号串全拆开)→ 写 N 个公式,或者用坑 1 的 TRIM+MID,能直接拖填充。

四、坑 3:全角标点不报错,静默算错

敲公式时输入法是中文状态,逗号、括号就是全角的。WPS 照单全收,Excel 直接报错。

公式(注意标点)

WPS 结果

Excel 结果

说明

=SUM(A1,A2)

30

#NAME?

中文逗号

=SUM(A1:A2)

30

#NAME?

全角括号

=SUMPF(A1:A2)

#NAME?

#NAME?

真·拼写错

=SUM(A1:A2)

30

30

正常对照

真拼写错 WPS 也会报错,但全角标点它算给你看。(A1=10、A2=30,本机实测。)

全角标点从哪来?中文输入法没切英文,或者从网页/文档/聊天记录里复制粘贴公式片段。外部拷进来的表最容易中招。

最危险的不是「算错」,是「你这儿算对、同事那儿报错」。你在 WPS 做完表,数字看着都对,发给用 Excel 的同事——公式在他们机器上一片 #NAME?。你这边完全无法预知,因为你屏幕上从来没出现过错误提示。

这一类先记住 3 条动作:

1. 敲公式切英文输入法。括号、逗号、等号全部半角,成本最低。

2. 外部拷进来的表,挑一个有小数的格用 =A1*1 复算一遍。对得上才算完。

3. 定稿前换台机器打开一次。团队 Excel 和 WPS 混用,这一步省掉后面一堆解释。

五、顺带说个好消息:WPS 现在比 Excel 2019 全

查完坑顺手测了一遍完整函数支持,结论有点反直觉——WPS 免费版现在装的函数,比 Excel 2019 多得多。以下全部在本机实测通过:

类别

函数

动态数组

SORT、SORTBY、UNIQUE、FILTER、SEQUENCE、RANDARRAY

查找替换

XLOOKUP、XMATCH、TEXTSPLIT、TEXTBEFORE、TEXTAFTER

数组运算

LET、LAMBDA、VSTACK、HSTACK、TOCOL、TOROW、CHOOSECOLS、CHOOSEROWS、TAKE、DROP、EXPAND、WRAPROWS

分组统计

GROUPBY

实测不支持

PIVOTBY(调用即抛异常)

所以不必因为「没有这些函数」就升级 Excel。除了上面 3 个坑,本机实测这些函数算出来的结果都是对的。

边界说清楚:我测的是 12.0 / Build 29161。你要是哪个函数直接报 #NAME?,那是你这版没上,别当成文章错了。怎么核对版本:WPS 左上角「设置 → 关于 WPS」,看版本号;测出来结果不一样,欢迎在评论区把你的版本号发我。

只记住这 3 个(照着改就行)

你写了什么

WPS 会怎样

怎么改

=TEXTBEFORE(文本,"-",2) 等第 3 参数≠1

返回第 1 段+分隔符+第 2 段,不是「男」,不报错

用 SUBSTITUTE+REPT+MID 组合(见坑 1 公式)

=TEXTSPLIT(…) / =UNIQUE(…) / =SORT(…)

只吐第一个值,其余静默丢弃

外面套 INDEX(…,n) 逐个取

=SUM(A1,A2) 等全角标点

WPS 正常出数,Excel 一片 #NAME?

敲公式切英文输入法,标点全用半角

2 个实测能用的替代公式(存下来直接套):

取第 n 段(不依赖坏参数,三段实测全对):

=TRIM(MID(SUBSTITUTE($A$2,"-",REPT(" ",LEN($A$2))),(n-1)*LEN($A$2)+1,LEN($A$2)))

只要动态数组的第 n 个值(实测正确):

=INDEX(TEXTSPLIT($A$2,","),n)

转给那个天天做表的同事

这张表别只扔收藏夹,收藏了大概率不会再打开。

身边真有人天天跟 WPS 较劲,直接转给他,比存着吃灰强。他的公式可能正在悄悄算错,自己还不知道——尤其那些把表发给 Excel 同事、结果对方那边一片报错的人。

今天不用多练:打开手头用了 TEXTBEFORE 或 TEXTSPLIT 的表,按上面两张表改一遍,测过一次,下次就不会踩。

后面我会接着拆「能照着做一遍」的表格流程,下一篇讲怎么核对两张表,关注一下不会走丢。

往期值得重看

相关学习资料