excel中2列内容的每种可能组合

时间:2015-04-20 07:17:01

标签: excel vba excel-vba

假设我有2列:

第1列(包含1000行):

U-0001

U-0002 

第二栏(包含10行):

B01

B02

B03

现在,我想生成两个这样的列(10 * 1000 = 10000行):

U-0001 B01

U-0001 B02

U-0001 B03

U-0002 B01

U-0002 B02

U-0002 B03

3 个答案:

答案 0 :(得分:6)

这应该这样做:

Sub combineTwoCol()

    ' i,j,k are counters for first col, second col and the answer col in order.
    k = 1
    For i = 1 To 1000
        For j = 1 To 10
            Cells(k, "C").Value = Cells(i, "A").Value
            Cells(k, "D").Value = Cells(j, "B").Value 
            k = k + 1
        Next j
    Next i
End Sub

编辑:你应该注意到我假设你只有那两列是文件,如果没有改变" A"和" B"到你需要的相应列。和" C"和" D"到你想要两个输出列的位置。

如果10和1000只是示例,而不是真正的值,你可以随时动态找到它们:

'this return to the variable the last row in column A
LastRowColA = Range("A65536").End(xlUp).Row

并将1000替换为LastRowColA

答案 1 :(得分:1)

这是一个公式版本: -

=IF(ROW()-ROW($A$1)<COUNTA(A:A)*COUNTA(B:B),OFFSET($A$1,(ROW()-ROW($A$1))/COUNTA(B:B),0)&" "&OFFSET($B$1,MOD(ROW()-ROW($A$1),COUNTA(B:B)),0),"")

在(比方说)C1输入并复制。

答案 2 :(得分:1)

动态数组(溢出)公式。适用于Excel 365,可能适用于Excel 2019,可能不适用于以前的版本。您只需要在一个单元格中输入公式(最佳为C1),它就会动态地用数据填充该列,而无需将其拖动/复制到其他单元格中。它也不是简单的数组公式,因此不需要ctrl + shift + enter。

=INDEX(($A:$A),ROUNDUP(SEQUENCE(COUNTA($A:$A)*COUNTA($B:$B),1,1,1)/COUNTA($B:$B),0))&" "&INDEX($B:$B,MOD(SEQUENCE(COUNTA($A:$A)*COUNTA($B:$B),1,0,1),COUNTA($B:$B))+1)

注意:如果您永远不想水平拖动该公式,则可以删除$符号,将其留在里面只是个好习惯。当然,也不需要(也不可能)垂直拖动它。

详细说明:

-该公式具有两个INDEX函数,用于获取级联所需的数组,以及它们之间的空格

-INDEX用于从数组生成单元格引用。本来希望使用INDIRECT,但目前不支持溢出数组公式

-first INDEX生成对A列值的引用。它会生成一个数组,该数组与总值的数量(因此为COUNTA函数)一样长,在您的2 * 3示例中为6个长度的数组。为此,它创建了一个很长的序列,并从1填充到此最大值。然后将序列中的每个数字除以A列中的值的数量,然后将其四舍五入,从而创建(在此示例中)数组{1,1,1,2,2,2}。然后索引对数组中的A列(行)进行引用-从而完成了第一部分

-second索引生成对B列值的引用。它再次使用SEQUENCE和COUNTA生成适当的长度数组,但是这里我们从0开始。这很重要,因为稍后我们使用MOD函数,该函数返回除法余数,并且只能从COUNTA($ B:$ B)-1。因此,我们在MOD之后向其添加1,这就是为什么我们从0开始序列的原因,所以最后,最终数组{1,2,3,1,2,3}从1开始 -INDEX函数最终会创建一对A列和B列值。从结果数组中可以看到,它们将是{[A1 B1],[A1 B2],[A1 B3],[A2 B1],[A2 B2],[A3 B3]},当然实际上是他们的价值观,这是我们最终想要的