Excel 中的交叉连接

问题描述 投票:0回答:4

我在 excel 中有两个范围。我正在寻找一种更简单的方法来将 Range1 的每一行与 Range2 的每一行组合起来。每个范围中的列数和行数可以更改。参考下图

只能用宏来完成还是有办法在普通或动态数组公式中完成。

或者你建议动态数组UDF

excel excel-formula dynamic-arrays
4个回答
3
投票

你可以这样做:

=LET( repliRange, D1:F3,
      byRange, A1:B2,
        rpR, ROWS( repliRange ),
        rpC, COLUMNS( repliRange ),
        byC, COLUMNS( byRange ),
        rIdx, SEQUENCE( rpR * ROWS( byRange ),,0 ),
        cIdx, SEQUENCE( 1, rpC + byC, 0 ),
        mux, INDEX( repliRange, MOD( rIdx, rpR ) + 1, SEQUENCE( 1, rpC, 0 )+1 ),
        noVBA, IF( cIdx < byC, INDEX( byRange, rIdx/rpR+1, cIdx + 1),
                               INDEX( mux, MOD(rIdx,rpC)+1, cIdx-1) ),
        noVBA )

需要 Excel 365。

D1:F3 是右侧数组 (repliRange),您希望将其交叉连接到 A1:B2 的左侧byRange。两边几乎可以有任意数量的行和列。也许变量顺序会以另一种方式更合乎逻辑,但我假设了一个句子逻辑“通过A1:B2复制D1:F3”

非LET版本

=IF( SEQUENCE( 1, COLUMNS( D1:F3 ) + COLUMNS( A1:B2 ), 0 ) < COLUMNS( A1:B2 ),
    INDEX( A1:B2,
           SEQUENCE( ROWS( D1:F3 ) * ROWS( A1:B2 ),,0 )/ROWS( D1:F3 )+1,
           SEQUENCE( 1, COLUMNS( D1:F3 ) + COLUMNS( A1:B2 ), 0 ) + 1),
    INDEX( INDEX( D1:F3,
                  MOD( SEQUENCE( ROWS( D1:F3 ) * ROWS( A1:B2 ),,0 ), ROWS( D1:F3 ) ) + 1,
                  SEQUENCE( 1, COLUMNS( D1:F3 ), 0 )+1 ),
           MOD(SEQUENCE( ROWS( D1:F3 ) * ROWS( A1:B2 ),,0 ),COLUMNS( D1:F3 ))+1,
           SEQUENCE( 1, COLUMNS( D1:F3 ) + COLUMNS( A1:B2 ), 0 )-1) )


0
投票

你可以试试:

=INDEX(
(A1:B2,D1:F3),
LET(x,SEQUENCE(6),IF(SEQUENCE(1,5)<3,1+FLOOR((x-1)/3,1),1+MOD(x-1,3))),
{1,2,1,2,3},
{1,1,2,2,2}
)

LET
行序为

嵌套。

然后

column
area
参数重复。


0
投票
= LAMBDA(RangeFrom, RangeTo,
      LET(repliRange, RangeTo, byRange, RangeFrom, 
rpR, ROWS(repliRange), 
rpC, COLUMNS(repliRange), 
byC, COLUMNS(byRange), 
rIdx, SEQUENCE(rpR * ROWS(byRange), , 0),
cIdx, SEQUENCE(1, rpC + byC, 0), 
To, INDEX(repliRange, MOD(rIdx, rpR) + 1, SEQUENCE(1, rpC, 0) + 1), From, TAKE(INDEX(byRange, rIdx / rpR + 1, cIdx + 1), , byC),
HSTACK(From, To)))

此 lambda 版本适用于一维和 n 维数组。


0
投票

这是我用于数组的公式,但我想它可以针对范围进行修改。

=TEXTSPLIT(
ARRAYTOTEXT(
TOCOL(Array_1) & "|" & TOROW(Array_2), 0), "|", ", ")

Example with range

© www.soinside.com 2019 - 2024. All rights reserved.