如下图所示,B列的【子类型】是用逗号分隔的不同型号,需要将B列内容拆分并扩展表格。
例如,B5单元格的内容需要根据分隔符拆分成4行,A列和C列内容保持不变并也扩展成4行,同时需要将B5单元格内容也扩充成4行并添加在表格右侧,最后需要将单价扩充成4行添加在最右侧,但只在第一行保留数值,其余行内容为空。
总体思路可以考虑使用REDUCE函数循环B列待拆分内容,循环一次生成当前类型的拆分结果,然后和其他拆分结果使用VSTACK函数堆积起来。下面以B3单元格为例来简单说明一下循环到某个单元格时如何进行拆分和堆积。
首先,使用TEXTSPLIT函数拆分B3单元格的内容到行:
=TEXTSPLIT(B3,,",")
需要注意的是,类型A需要扩充的行数以B3单元格拆分的行数为准,因此,其余列的扩充可以均以此为基准来完成。
在子类型拆分出来的情况下,如何将A3:C3的A列和C列也扩充成3行呢?可以用IF函数标题判断的方法:
=IF(A2:C2=B2,TEXTSPLIT(B3,,","),A3:C3)
如果标题等于「子类型」则保留B列拆分结果,否则保留A3:C3单元格对应内容,A列和C列内容会根据B列拆分结果自动扩充为3行。
接下来,要把原【子类型】也扩充成3行,拼接在上一步返回结果右侧,这个扩充,我们仍然可以基于拆分结果完成。
=T(N(TEXTSPLIT(B3,,",")))&B3
因为拆分结果是文本,所以外面套上N函数会都变成0,仍然保持3行。数字0外面再嵌套T函数,会让所有的0都变成空,行数仍然是3行。这样再用&连接B列「子类型」文本,就将「子类型」文本扩充到了3行。
下一步,使用HSTACK函数将前面两步生成的结果横向拼接起来。
=LET(s,TEXTSPLIT(B3,,","),HSTACK(IF(A2:C2=B2,s,A3:C3),T(N(s))&B3))
最后,还需要生成一个单价列,只有第一行是单价数字,其余结果为0。这一列仍然可以根据拆分结果完成:
=LET(s,TEXTSPLIT(B3,,","),(s=@s)*C3)
有了上面的分析,可以嵌套入REDUCE函数写出最终公式:
=REDUCE(E2:I2,B3:B6,LAMBDA(x,y,VSTACK(x,LET(s,TEXTSPLIT(y,,","),HSTACK(IF(A2:C2=B2,s,OFFSET(y,,-1,,3)),y&T(N(s)),(s=@s)*OFFSET(y,,1))))))
图文制作 超人
原载:超人一筹高效办公