我有一个表 A2:E7,其中每一列都来自一个动态数组公式。结果,=A2#
、=B2#
等工作并溢出。
现在,我想对每一行使用 TEXTJOIN
,预期结果在 F 列中。但 =TEXTJOIN(",",TRUE,A2:E2#)
不起作用。我不知道如何编写范围的动态引用。
有人可以帮忙吗?
答案 0 :(得分:1)
上一个答案
这个有一个缺陷:它假设 1 个字符的单元格值,但我把它留在这里以供参考。下面的新答案。
你可以这样做:
=LET( m, A2:E7,
rSeq, SEQUENCE( ROWS(m) ),
L, MMULT( LEN(m),SIGN( SEQUENCE( COLUMNS(m) ) ) )*2-1,
i, MMULT(--( TRANSPOSE( rSeq ) < rSeq ), L ) + rSeq - 1,
MID( TEXTJOIN( ",", TRUE, m ), i+1, L ) )
修改后的答案
这可以采用可变大小的单元格值:
=LET( m, A2:E7,
rSeq, SEQUENCE( ROWS(m) ),
L, MMULT( LEN(m)--(m<>""), SIGN( SEQUENCE( COLUMNS(m) ) ) ) - 1,
i, MMULT(--( TRANSPOSE( rSeq ) < rSeq ), L ) + rSeq,
IFERROR( MID( TEXTJOIN( ",", TRUE, m ), i, L ), "" ) )
<块引用>
添加了@P.b 的 IFERROR 包装器以防止空白行抛出 值错误。 - 谢谢 P.b!不错的收获。
可能还有一些地方需要优化。基本上,它在最后做了一个巨大的 TEXTJOIN,用“,”分隔符连接所有内容。考虑到这一点,它准备了一些用于分解巨大文本 blob 的数组。 L 创建每个单元格值及其分隔符(小于 1)的长度数组。 i 是一个索引,它简单地将 L 的值连续相加到一个列数组中,以告诉 MID 函数在哪里中断,而 L 则告诉 MID 巨型文本 blob 的每个块的大小。
<块引用>注意:如果分隔符超过 1 个字符,则失败。
扩根法
如果要求是:
那么这个公式应该有效:
=LET( root, A2:E2,
c, COLUMNS(root),
m, IFERROR( INDEX(root,1,1):INDEX(root,1,c)#, "" ),
rSeq, SEQUENCE( ROWS(m) ),
L, MMULT( LEN(m)--(m<>""), SIGN( SEQUENCE( c ) ) ) - 1,
i, MMULT(--( TRANSPOSE( rSeq ) < rSeq ), L ) + rSeq,
IFERROR( MID( TEXTJOIN( ",", TRUE, m ), i, L ), "" ) )
其中 root (A2:E2) 是包含每个动态数组根的输入范围。
<块引用>§ - 如果它们的大小不同,则下重叠将包含 0。 这可以通过用“”替换 0 来解决,但如果您的输入 通常包含有效的 0,这将是一个糟糕的方法,所以我离开了 满足并保持对等长动态数组的要求 作为输入代替。如果您需要带零的可变长度数组, 这是可能的,但会增加更多可能会减慢速度的步骤。