|
在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这个大哥级函数人狠话不多← 公式里常出现的"@"、"#"、"."是干啥的←
|