如下圖所示,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))))))
圖文制作 超人
原載:超人一籌高效辦公