我的理解是代码应该递归地对“数字”列表中的每个单元格执行此操作。
第一个数字映射到“行”数据中的所有行,然后列表中的下一个数字也映射到相同的行,依此类推。
此公式返回范围
G2:J7
: 内的值
=LET(r1st, $A$2:$A$4,
r2nd, $C$2:$E$3,
cntA, ROWS(r1st),
cntB, ROWS(r2nd),
lstA, INDEX(r1st, INT(SEQUENCE(cntA*cntB,,1,1/cntB))),
lstB, CHOOSEROWS(r2nd,MOD(SEQUENCE(cntA*cntB,,0),cntB)+1),
HSTACK(lstA,lstB))
我为该范围指定了自定义数字格式
0;-0;;@
,否则 A、C 行以 0 结尾。
我使用@ScottCraner 的这个答案来解决大部分问题:
根据溢出范围内的两个数据集创建笛卡尔积的公式
编辑:
没有自定义数字格式。 也已更新,因此如果范围改变,将会扩展。
=LET(r1st, $A$2:$A$4,
r2nd, IF($C$2:$E$3=0,"",$C$2:$E$3),
cntA, ROWS(r1st),
cntB, ROWS(r2nd),
lstA, INDEX(r1st, INT(SEQUENCE(cntA*cntB,,1,1/cntB))),
lstB, CHOOSEROWS(r2nd,MOD(SEQUENCE(cntA*cntB,,0),cntB)+1),
HSTACK(lstA,lstB))
您可以使用 Unpivot2 宏。
首先,准备源表。将数字复制到新位置,然后通过转置复制上面的行(选择 C1:E2,复制,选择 G3,选择性粘贴):
然后选择表格并激活数据透视单元:
运行宏并得到结果:
使用 VBA 可以进行就地扩展,但如果可以将结果放置在不同的区域,您可以尝试以下操作:
A2:XLOOKUP(TRUE, A:A <> "", A:A, , , -1)
动态包含非空行=LET(
nums, A2:XLOOKUP(TRUE, A:A <> "", A:A, , , -1),
rows_, C2:E3,
num_row, LAMBDA(acc, num,
VSTACK(
acc,
HSTACK(
EXPAND(num, ROWS(rows_), , num),
IF(ISBLANK(rows_), "", rows_)
)
)
),
header, EXPAND("", , 1 + COLUMNS(rows_), ""),
REDUCE(header, nums, num_row)
)