动态范围参考

时间:2021-06-30 16:16:22

标签: excel-formula

我有一个表 A2:E7,其中每一列都来自一个动态数组公式。结果,=A2#=B2# 等工作并溢出。

现在,我想对每一行使用 TEXTJOIN,预期结果在 F 列中。但 =TEXTJOIN(",",TRUE,A2:E2#) 不起作用。我不知道如何编写范围的动态引用。

有人可以帮忙吗?

enter image description here

1 个答案:

答案 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 个字符,则失败。

enter image description here

扩根法

如果要求是:

  • 输入必须是一行单元格,每个单元格都包含下面溢出的动态数组。
  • 列数是可变的,但是连续的。
  • 分隔符是一个字符。
  • 所有输入单元格都是一列维度的动态数组。
  • 所有动态数组的大小相同。§

那么这个公式应该有效:

=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,这将是一个糟糕的方法,所以我离开了 满足并保持对等长动态数组的要求 作为输入代替。如果您需要带零的可变长度数组, 这是可能的,但会增加更多可能会减慢速度的步骤。