WPS正式开启函数式编程时代

会飞的鱼

KVP函数专家、创作者俱乐部成员

4月24日,WPS版本号更新到了16894,此次更新共新增了12个函数,其中包含了7个LAMBDA类函数,4个WPS独有函数(其中ROUNDBANK函数为16729版本更新),2个其他类辅助函数,具体函数如下图所示。

我将分三天分享新增函数的使用方法。

第1天:LAMBDA类函数

第2天:REGEXP正则函数

第3天:WPS独有函数

今天是第1天,分享LAMBDA类函数。

一、MAP函数(循环数组返回计算后每个值结果)

函数可以将一个或多个大小相同的单元格区域或数组作为变量数组,函数会依次循环单元格区域或数组中的每一个值,将一个或多个值传递给LAMBDA函数计算,函数将返回变量数组中每个值计算后的结果,返回的结果数组大小和传入的变量数组大小相同,函数语法如下图所示。

在动态数组功能和新函数的支持下,在处理一些复杂的问题时,也变得相对轻松很多,在软件功能变得强大的同时,对处理问题方式也有了更高的要求,比如使用UNIQUE函数对每一行数据去重复项后使用TEXTJOIN函数拼接成一个字符串,又比如使用SUM函数对每一行数据求和,需要输入公式后向下填充到多个单元格区域,无法输入一个公式后通过动态数组溢出的功能完成。

这是因为一些新函数自身就可以返回数组结果,所以无法同时计算多组值并且返回多组独立的结果,比如使用FILTER函数,无法一次筛选多个值并且返回多组结果,又比如使用UNIQUE函数也无法同时对多行或多列去重复后返回对应的多行或多列结果

还有当使用了聚合函数时,如SUM、COUNTA、MIN、MAX、CONCAT等函数时,这些函数可以将多个值计算后返回一个值,在使用这些函数时,因为函数只返回一个单值,无法返回数组,自然也无法使用动态数组的溢出功能了。

当使用了聚合函数或使用了可以返回数组结果的新函数时,同时需要输入一个公式可以查询或计算返回多组独立的结果,使用MAP函数可以解决这一问题。

示例1、根据姓名查询所有报名课程

=MAP(E5:E9,LAMBDA(x,TEXTJOIN("、",TRUE,FILTER(C5:C12,B5:B12=x))))

示例2、对每个单元格中的内容去重复项

=MAP(C17:C24,LAMBDA(x,TEXTJOIN("、",TRUE,UNIQUE(TEXTSPLIT(x,,"、")))))

需要注意的是,MAP函数中的LAMBDA函数只能返回单值,如果LAMBDA函数返回数组,MAP函数将返回错误值#CALC!。

二、SCAN函数(循环数组返回计算后每个中间过程值)

SCAN函数可以先指定一个初始化变量,然后再指定一个单元格区域或数组作为变量数组,函数会向LAMBDA函数传入2个参数,第1个参数为初始化值,第2个参数为变量数组,函数会依次循环参数2变量数组中的每一个值,在循环过程中,函数会将当前计算结果保存,在下一次计算时,会将上一次计算的结果通过变量1传入LAMBDA函数,SCAN函数将返回变量数组中每个值计算后的结果,返回的结果数组大小和参数2传入的变量数组大小相同,函数语法如下图所示 。

示例1、根据收入支出计算余额

=SCAN(0,D5:D12,LAMBDA(x,y,x+y))

示例2、拆分并填充合并单元格

=SCAN(,B17:B24,LAMBDA(x,y,IF(y<>"",y,x)))

示例3、根据库存数量按下单顺序发货,发完为止,将可以发货的订单筛选出来

=FILTER(B29:D36,SCAN(0,D29:D36,LAMBDA(x,y,x+y))<=G28)

需要注意的是,SCAN函数中的LAMBDA函数只能返回单值,如果LAMBDA函数返回数组,SCAN函数将返回错误值#CALC!。

三、REDUCE函数(循环数组返回计算后的累计结果)

REDUCE函数可以先指定一个初始化变量,然后再指定一个单元格区域或数组作为变量数组,函数会向LAMBDA函数传入2个参数,第1个参数为初始化值,第2个参数为变量数组,函数会依次循环参数2变量数组中的每一个值,在循环过程中,函数会将当前计算结果保存,在下一次计算时,会将上一次计算的结果通过参数1传入LAMBDA函数,REDUCE函数将返回变量数据中每个值计算后的累计结果,函数语法如下图所示。

示例1、批量查询多个姓名的明细

=REDUCE(B4:D4,F5:F7,LAMBDA(x,y,VSTACK(x,FILTER(B5:D12,B5:B12=y,y))))

示例2、根据工资明细表生成工资条

=DROP(REDUCE("",B17:B22,LAMBDA(x,y,VSTACK(x,VSTACK(B16:E16,OFFSET(y,0,0,1,4))))),1)

示例3、根据替换名单批量替换人员

=MAP(C33:C38,LAMBDA(人员名单,REDUCE(人员名单,F33:F36,LAMBDA(x,y,SUBSTITUTE(x,y,OFFSET(y,0,1))))))

四、BYROW函数(循环数组行返回计算后的一列结果)

BYROW函数可以将一个单元格区域或数组按行循环,将每行数据传入LAMBDA函数计算,函数将返回每一行计算后的一列结果,返回的结果数组行数和传入的变量数组行数相同,函数语法如下图所示。

示例1、计算多个科目的总分

=BYROW(C5:E10,LAMBDA(x,SUM(x))

示例2、将省市区三个单元格的值连接到一个单元格

=BYROW(B15:D20,LAMBDA(x,TEXTJOIN("-",TRUE,x)))

五、BYCOL函数(循环数组列返回计算后的一行结果)

BYCOL函数可以将一个单元格区域或数组按列循环,将每列数据传入LAMBDA函数计算,函数将返回每一列计算后的一行结果,返回的结果数组列数和传入的变量数组列数相同,函数语法如下图所示。

示例1、计算每个科目的平均分

=ROUND(BYCOL(C5:E10,LAMBDA(x,AVERAGE(x))),2)

六、MAKEARRAY函数(根据指定行列返回计算后的数组结果)

MAKEARRAY函数可以指定行数和列数,函数将根据行数和列数的乘积数来循环,每次将当前对应行列值传入LAMBDA函数计算,MAKEARRAY函数将返回计算后的数组结果,函数语法如下图所示。

示例1、生成九九乘法表

=MAKEARRAY(9,9,LAMBDA(x,y,IF(x>=y,y&"x"&x&"="&x*y,"")))

七、ISOMITTED函数(判断LAMBDA参数是否省略)

ISOMITTED函数可以判断LAMBDAB函数中的参数是否省略,函数语法如下图所示。

示例1、创建计算边长自定义公式

=LAMBDA(长,[宽],IF(ISOMITTED(宽),长*4,(长+宽)*2))(C5)

使用LAMBDA函数创建一个包含可选参数的自定义函数,在参数名称添加“[]”符号即可将参数设置为可选,使用ISOMITTED函数判断参数“宽”是否省略,如果省略使用正方形计算公式边长*4,否则使用长方形计算公式(长+宽)*2。

八、LAMBDA函数的简写(公式中的语法糖)

在使用需要LAMBDA函数作为参数的函数时,主要应用于MAP、SCAN、REDUCE、BYROW、BYCOL、MAKEARRAY、GROUPBY、PIVOTBY函数中,新增了一种简写语法,可以在参数为LAMBDA函数的参数中直接输入函数名称,可以省略LAMBDA函数的构架过程。

其中GROUPBY、PIVOTBY函数需要过段时间更新,本次就不展开具体讲解了。

示例1、计算多个科目的总分

=BYROW(C5:E10,SUM)

示例2、根据收入支出计算余额(支出为负数)

=SCAN(,D15:D22,SUM)

示例3、筛选多列缺考姓名名单

在没有LAMBDA类函数之前,处理这类问题需要添加辅助列,或使用MMULT函数,公式如下。

=FILTER(B27:F32,MMULT(N(C27:F32="缺考"),SEQUENCE(4,,,0)))

虽然MMULT函数可以解决,但是MMULT函数却让很多小伙伴直呼头疼,现在可以使用BYROW函数,公式会更简洁易懂,公式如下。

=FILTER(B27:F32,BYROW(N(C27:F32="缺考"),SUM))

示例4、支持自定义函数

使用LAMBDA函数通过名称管理器创建自定义函数,或LET函数中创建自定义函数,也是支持语法糖的,如下图所示。

=LET(fx,LAMBDA(x,TEXTJOIN("-",TRUE,x)),BYROW(B37:D42,fx))

16894版本已开始逐步更新,目前官网还没有更新,想提前体验的小伙伴可以通过下方链接下载

以上是本次分享的内容,欢迎大家留言探讨,我们明天见~

辽宁省
浏览 9546
40
110
分享
99+ +1
82
40 +1
全部评论 82
 
问个小白问题,公式这个的fx是已经提前设置好了的还是公式本身这样子的
· 广东省
回复
会飞的鱼

KVP函数专家、创作者俱乐部成员

fx是在let函数中定义的自定义函数,定义后可以在当前let函数中使用。
· 辽宁省
回复
 
学习
· 四川省
回复
 
zha7090

创作者俱乐部成员

功能越多,要学的也就越多。还是期待AI简化流程
· 广东省
回复
 
学习了
· 浙江省
回复
 
· 上海
回复
 
打卡
· 云南省
回复
 
大神,能帮我看看问题出现在哪吗?https://bbs.wps.cn/topic/29106
· 广西
回复
 
打卡
· 江苏省
回复
 
打卡
· 福建省
回复
 
WPS365没有吗
· 云南省
回复
 
打卡
· 河南省
回复
 
为什么我更新不到这个版本啊????
· 广东省
回复
 
打卡
· 上海
回复
 
可以直接使用吗
· 湖南省
回复
 
学习
· 广东省
回复
 
打卡
· 江西省
回复
 
懒得批爆

创作者俱乐部成员

微信打开包含以上函数的表格能正常显示么
· 四川省
回复
 
打卡
· 江西省
回复
 
厉害啦
· 湖南省
回复
 
哈时候 线上文档 也能跟上进度,支持新的功能
· 广东省
回复