|
在Excel或WPS数据整理中,有一个经典且棘手的需求是:如何根据一列给定的数字,准确的重复对应的数据行。
具体的问题场景是:
我们的数据表(A:D列)包含关键信息:如SKU、货号、单位、数量等,是一个典型的一维列表。而相邻的E列则明确指定了每行数据需要被复制的次数。目标是根据E列的“重复次数”,自动生成一个包含所有数据源行数据的新列表G1:J7,而无需任何手动操作。
常规的复制粘贴或基础公式难以简洁的、动态的解决此类问题。手动操作繁琐且不具扩展性;传统的函数组合也常常复杂冗长。而在新版的Excel和WPS表格中引入了动态数组函数。
今天小编借助新函数REDUCE、LAMBDA、VSTACK和SEQUENCE,以及传统的OFFSET与IF函数,构建一个简洁、强大的单公式解决方案。这个公式可以实现遍历重复次数列,逐行读取次数,并动态堆叠生成对应行数的数据。整个过程实现了完全自动化。
接下来,小编将深入拆解这个公式的每个组成部分,详细阐述其工作原理,让大家能更透彻理解其设计逻辑。
首先我们先来处理“第一行A2:D2重复3(E2值)行”的效果。
首先使用OFFSET位置偏移函数:
OFFSET函数以E2为基准点,向左偏移1列移动到D2,再设置宽度为-4(向左扩展4列),实际获取A2:D2区域的值。得到一个1行4列的数组:
{“a01″,”w”,”个”,10}
说通俗一点就是,我们实现了通过E2单元格这个位置,推算得到了它对应的左侧的sku、货号、单位、数量的整行数据。
继续使用SEQUENCE自定义生成序列函数:
=SEQUENCE(E2)
通过SEQUENCE函数可以得到一个3行的(E2值),默认1列的、默认步长值为1的等差数列:
{1;2;3}
再说通俗一点就是,E2单元格值显示重复几次,我们就会生成一个包含几个数字元素的纵向数组(数列)。因为要重复3次,所以生成了{1;2;3}这样的包含3个数字的数组。
继续使用IF条件判断函数:
=IF(SEQUENCE(E2),OFFSET(E2,,-1,,-4))
如果第一参数测试条件是非0值,则表示逻辑真值TRUE;
如果第一参数测试条件是0值,则表示逻辑假值FALSE。
IF函数将SEQUENCE生成的数组{1;2;3}中每个数字视为TRUE与第二个参数配合。由于第二个参数是单行,会重复3次,变成重复的3行。
再说的通俗一点就是,IF的3次真值需要返回的第2参数都会显示OFFSET的返回结果,即重复3次OFFSET的返回值,生成3行4列的数组:
{“a01″,”w”,”个”,10;
“a01″,”w”,”个”,10;
“a01″,”w”,”个”,10}
继续使用VSTACK纵向堆叠函数:
=VSTACK(A1:D1,IF(SEQUENCE(E2),OFFSET(E2,,-1,,-4)))
VSTACK函数将A1:D1表头与上一步返回的3行4列的行重复数据堆叠,更新为目前这个4行4列的数组。
至此,我们完成了样板数据,也就是“第一行A2:D2重复3次”的操作,那么我们如何重复这个转换的运算逻辑,将第二行的A3:D3重复2次,再将第三行的A4:D4重复1次后,依次堆叠在“第一行重复结果”的下方呢?
下面我们就开始思考解决这个问题了,只要解决了这个问题,那么数据的批量处理就完成了。
我们用到的就是REDUCE这个循环计算累加函数了。
我们可以尝试设置lambda函数的变量。
将A1:D1表头行设置为初始累积值x。
将E2所代表的重复次数设置为循环区域中当前要处理的值(当前值)y。
则REDUCE函数的第3参数lambda自定义计算逻辑就设置好了:
LAMBDA(x,y,VSTACK(x,IF(SEQUENCE(y),OFFSET(y,,-1,,-4))))
也就是说reduce函数的第1参数初始值(初始累积值)要用A1:D1表头来表示。第2参数要遍历的数组范围设置为E2:E4,也就是将E2:E4区域内的每个“指定重复值”依次传递给y,重复lambda自定义计算逻辑,最后将每次处理的结果(垂直堆叠)累积起来。
则补全REDUCE函数的第1参数与第2参数:
=REDUCE(A1:D1,E2:E4,LAMBDA(x,y,VSTACK(x,IF(SEQUENCE(y),OFFSET(y,,-1,,-4)))))
其实在这个公式中,初始值A1:D1表头只在第一次遍历(E2:E4遍历E2)时,传递给了累积值x,完成A1:D1表头与第1行重复3次后的垂直堆叠,然后作为下一次遍历时新的累积值x。
经过REDUCE遍历E2:E4后,得到的结果是一个7行4列的数组,包括表头和每行数据根据指定次数重复后的结果。这个返回结果数组自动溢出到G2:J8,得到最终的结果。
学习Excel/如果你没有天赋/那就一直重复/当你快到本能反应的时候/你的重复就是别人眼中的天赋/冲破捆绑/展翅翱翔/回顾关键内容/善用图片表达/学会建立联系/拓展深度广度/浓缩关键概念/应用到行动中/善于归纳总结/尝试进行分享
map遍历scan遍历reduce迭代pivotby降维
pivotby函数byrow函数groupby函数let函数
对单元格部分文字内容替换 格式更改←
借助这个函数!合并工作表简直太好用←
比vlookup还强大的动态随机查询←
根据起始序号与终止序号写入内容←
regexp正则提取:款式&尺码多组提取←
一个关于人口普查Excel户籍整理的问题←
一个关于人口普查Excel户籍整理的问题2←
regexp+vlookup根据简称查询全称←
regexp+countif+filter根据全称查找简称←
excel1秒批处理1000条混乱时间数据←
Regexp这个大哥级函数人狠话不多←
公式里常出现的”@”、”#”、”.”是干啥的←
|