在为“如何将行值合并到前一行的列中?”创建解决方案时,我编写了公式:
[G11] =LET(
c,COLUMNS(Table1),
at_l,INDEX(Table1,0,c),
n,ROWS(Table1),
af,FILTER(HSTACK(Table1,SEQUENCE(n)),Table1[Product]<>"null"),
aw,DROP(VSTACK(INDEX(af,0,c+1),n+1),1),
HSTACK(
TAKE(af,,c),
BYROW(
SEQUENCE(ROWS(af)),
LAMBDA(i,
TEXTJOIN(", ",FALSE,
DROP(TAKE(at_l,INDEX(aw,i)-1),INDEX(af,i,c+1))
)
)
)
)
)
手动检查没有错误,但是不行,如下图:
数据表:
# | 数量 | 产品 | 选项 | 商品名称 |
---|---|---|---|---|
1 | 3 | CHR124 | 椅子 | |
空 | 空 | 空 | .FOC | 雾 |
2 | 1 | SFA478 | 沙发 | |
空 | 空 | 空 | .A | A |
空 | 空 | 空 | .B | B |
空 | 空 | 空 | .C | C |
空 | 空 | 空 | .D | D |
空 | 空 | 空 | .E | E |
空 | 空 | 空 | .F | F |
空 | 空 | 空 | .G | G |
空 | 空 | 空 | .H | H |
3 | 2 | TBL8954 | 桌子 | |
空 | 空 | 空 | .我 | 我 |
空 | 空 | 空 | .J | J |
空 | 空 | 空 | .K | K |
空 | 空 | 空 | .L | L |
空 | 空 | 空 | .M | M |
空 | 空 | 空 | .N | N |
空 | 空 | 空 | .O | O |
空 | 空 | 空 | .P | P |
为了调试这个问题,我编写了中间公式:
[G15] =LET(
c,COLUMNS(Table1),
at_l,INDEX(Table1,0,c),
n,ROWS(Table1),
af,FILTER(HSTACK(Table1,SEQUENCE(n)),Table1[Product]<>"null"),
aw,DROP(VSTACK(INDEX(af,0,c+1),n+1),1),
HSTACK(
af,
aw
)
)
然后
[G19] =BYROW(
SEQUENCE(ROWS(G15:G17)),
LAMBDA(i,
TEXTJOIN(", ",FALSE,
DROP(TAKE(Table1[Item Name],INDEX(M15:M17,i)-1),INDEX(G15:L17,i,6))
)
)
)
这也不起作用。
但只需稍加修改即可工作:
[I19] =SCAN("",
SEQUENCE(ROWS(G15:G17)),
LAMBDA(a,i,
TEXTJOIN(", ",FALSE,
DROP(TAKE(Table1[Item Name],INDEX(M15:M17,i)-1),INDEX(G15:L17,i,6))
)
)
)
但是经过此修改后的主公式仍然不起作用:
=LET(
c,COLUMNS(Table1),
at_l,INDEX(Table1,0,c),
n,ROWS(Table1),
af,FILTER(HSTACK(Table1,SEQUENCE(n)),Table1[Product]<>"null"),
aw,DROP(VSTACK(INDEX(af,0,c+1),n+1),1),
HSTACK(
TAKE(af,,c),
SCAN("",
SEQUENCE(ROWS(af)),
LAMBDA(a,i,
TEXTJOIN(", ",FALSE,
DROP(TAKE(at_l,INDEX(aw,i)-1),INDEX(af,i,c+1))
)
)
)
)
)
我做了更多的调试修改,但最终什么也没得到。当我用 REDUCE 替换 TEXTJOIN 时,甚至 Excel 也崩溃了。
我找到了问题的解决方案,但上述问题仍然让我恼火。
它闻起来像一个 Excel bug,但有人可以评论它或提供解释吗?
=LET(x,SCAN(,Table1['#],LAMBDA(a,b,IF(b="null",a,b))),
u,UNIQUE(x),
MAKEARRAY(ROWS(u),6,LAMBDA(a,b,IF(b<6,XLOOKUP(INDEX(u,a),Table1['#],CHOOSECOLS(Table1,b)),ARRAYTOTEXT(DROP(FILTER(+Table1[Item Name],x=INDEX(u,a)),1))))))
SCAN 会重复
#
中的先前值,以防出现 null
接下来我们使用 MAKEARRAY 循环遍历该数组的唯一值,并过滤掉扫描数组 (x) 等于唯一值的 Item Name
值正在循环的 x 的值。过滤结果包装在 ARRAYTOTEXT 中。第一列是 x 到其各自列的 XLOOKUP 结果。