金山WPS

关注公众号 jb51net

关闭
软件教程 > 办公软件 > 金山WPS >

搞定分段数字分别排序! wps中lambda自定义+map循环遍历

脚本之家

问题求助SOS:有没有大神帮我解决这个问题啊?我的数据在单元格内是一串长数字,数字字符串被若干个逗号分成了若干段,我想对每段的数字分别从小到大排序后,输出到新的单元格,有办法设置一个公式一次性实现吗?

小编想说,这种问题是非常考验我们对Excel或WPS综合运用的能力,它具有非常浓重的真实的职场办公的痕迹。建议大家一定要学习它的解题思路,让我们从初级办公向高级办公迈进,不要只是停留在简单的vlookup入门函数上。

当然了,这个问题是肯定能实现的,也非常的有趣实用。

简化数据源,如下图所示:

A列是一列数据,我们发现每个单元格内都是由逗号间隔开的若干段数字字符串,且每段数字的长度也是不固定的。那么,我们最终想要的结果就是:将每个单元格内的各段数字重新单独升序(从小到大)排序后,输出新的结果放置到B列。(注意:只是对每段数字的排序,各段之间互不干涉)

这种问题,放在以前,小编也是一次性解决不了的,但是Excel和WPS表格都更新了很多类似于VBA的高级逻辑迭代函数,它们的出现大大增强了我们对数据的处理能力。以前我们解决不了的、需要借助很多辅助列的、等等问题都能轻松应对。

这道题就用到了lambda自定义、map循环遍历,解决分段数字每段排序的问题,以前不敢想的都实现了!

我们的思路肯定是:将单元格每段的数字拆分到不同单元格中,然后对每个单元格的数字分别排序,最后在合并起来。

首先使用TEXTSPLIT函数进行拆分列:

=TEXTSPLIT(A2,",")

使用列分隔符逗号,将A2单元格内的字符串进行分列,将各段数字以数组溢出的形式放置在一行多列当中。

由于我们要对B2~F2单元格的每段数字分别排序,为了便于后续自定义函数、循环遍历函数的理解。我们先来解决B2单元格这一段数字“321”的排序。

使用REGEXP正则表达式函数:

=REGEXP(A6,"\d")

\d:表示任意的单个数字

借助这个正则表达式,可以将A6单元格的数字以数组溢出的方式分别提取到一行多列的单元格中。

向外嵌套TOCOL函数:

=TOCOL(REGEXP(A6,"\d"))

将一行三列的数组数据转置为一列三行的数据(行转列)。

向外嵌套SORT函数:

=SORT(TOCOL(REGEXP(A6,"\d")),1,1)

对这个一列三行的数组溢出区域,以第一列(只有1列)为排序依据,以升序为排序顺序进行排序。

向外嵌套CONCAT函数:

=CONCAT(SORT(TOCOL(REGEXP(A6,"\d")),1,1))

将排序好的一列多行的数组区域合并至一个单元格中。

至此,我们对B2单元格,这一个样板数据进行了升序排序,那么我们想要依次对C2、D2、E2、F2都进行这样重复的排序工作,该怎么实现呢?

LAMBDA函数是自定义函数的构造器,是Excel365与WPS表格新增的“函数生成器”,允许我们自定义匿名函数,无需VBA就能创建可重复使用的计算逻辑。

基础结构参数:

LAMBDA(单个元素, 处理逻辑)

所以我们定义TEXTSPLIT函数拆分出来的每段数字(比如B2的“321”)为参数x,然后对这个参数x定义的计算规则就是我们上面所展示的B6单元格的公式运算规则:

CONCAT(SORT(TOCOL(REGEXP(x,"\d")),1,1))

也就是说,对拆分出来的每段数字字符串,都执行这样规则的排序。原理很简单吧!

完善公式为:

=LAMBDA(x,CONCAT(SORT(TOCOL(REGEXP(x,"\d")),1,1)))

但是目前不会输出正常值的,因为LAMBDA只是一个“函数构造器”,只构造了逻辑,而不会输出实际值。

MAP函数是数组迭代(遍历)处理器,属于数组函数(“迭代计算类”函数)。是对数组中的每个元素批量应用自定义逻辑(通过LAMBDA定义),并返回同维度的结果数组。

强大优势:

自动遍历输入数组的每个元素,相当于“循环执行”LAMBDA函数。是Excel“动态数组”功能的重要组件,支持批量处理数据而无需下拉填充公式。

函数结构

MAP(待处理数组,LAMBDA(单个元素, 处理逻辑))

所以最终公式是这样的:

=MAP(TEXTSPLIT(A2,","),LAMBDA(x,CONCAT(SORT(TOCOL(REGEXP(x,"\d")),1,1))))

第二参数:

LAMBDA(x,CONCAT(SORT(TOCOL(REGEXP(x,"\d")),1,1)))

定义了拆分后的每段数字的排序规则。

第一参数:

是TEXTSPLIT拆分出来的每段数字。运用第二参数的排序规则,对第一参数拆分后的每段数字依次循环遍历进行处理。

用LAMBDA定义“数字排序”规则,MAP负责对数组中的每个数字应用该规则。简单说:LAMBDA是“大脑”定义逻辑,MAP是“双手”执行逻辑。

最后的最后使用TEXTJOIN函数:

=TEXTJOIN(",",,MAP(TEXTSPLIT(A2,","),LAMBDA(x,CONCAT(SORT(TOCOL(REGEXP(x,"\d")),1,1)))))

将排序好的各段数字用逗号合并至一个单元格即可。

推荐阅读:wps星期排序怎么弄? WPS利用AI编写代码对行内星期正向排序的技巧