Excel – 多列,不同的组合

我有4个不同的参数列,如果这是正确的话。 每个参数有大约3-5个variables。 我想要做的是我想创build4个不同参数的所有可能的组合,同时保持不同的列。 所以我们假设我有以下几个例子:

**Column A | Column B | Column C** Chicago | Football | Red New York | Soccer | White Seattle | Hockey | Blue 

我想要的是,所有的组合,我可以从这些专栏中,我可以说明如下:

 **Column A | Column B | Column C** New York | Football | Blue New York | Football | Red New York | Football | White New York | Soccer | Blue New York | Soccer | Red New York | Soccer | White New York | Hockey | Blue New York | Hockey | Red New York | Hockey | White Chicago | Football | Blue Chicago | Football | Red Chicago | Football | White... 

等等。

对不起,我犯了一个可怕的错误。 没有检查出我的整个excel。 你需要应用4个公式。

复制到D1:

 =IF(ROW()-ROW($D$1)+1<=COUNTA(A:A)*COUNTA(B:B)*COUNTA(C:C),INDEX(A:A,INT((ROW()-ROW($D$1))/(COUNTA(B:B)*COUNTA(C:C))+1)),"") 

在E1中复制:

 =IF(ROW()-ROW($E$1)+1<=COUNTA(A:A)*COUNTA(B:B)*COUNTA(C:C),INDEX(B:B,MOD(ROW()-ROW($E$1),COUNTA(B:B))+1),"") 

在F1中复制:

 =IF(ROW()-ROW($F$1)+1<=COUNTA(A:A)*COUNTA(B:B)*COUNTA(C:C),INDEX(B:B,MOD(ROW()-ROW($F$1),COUNTA(B:B))+1),"") 

最后复制到G1:

 =+D1&" "&E1&" "&F1 

什么是计数每列的单元格,如果没有足够的每个组合(leng(A)* leng(B)* leng(C)),它会添加一个元素。

在这里输入图像说明

这会给你所有可能的组合:

 Function fifth(arr() As Variant) As Variant() Dim temp() As Variant Dim i As Long Dim j As Long Dim t As Long ReDim temp(1 To (UBound(arr, 1)) ^ (UBound(arr, 2) + 1), LBound(arr, 2) To UBound(arr, 2)) As Variant For i = 1 To (UBound(arr, 1) ^ UBound(arr, 2)) For j = 1 To UBound(arr, 2) t = Int((i Mod ((UBound(arr)) ^ j)) / (((UBound(arr)) ^ j) / (UBound(arr)))) temp(i, j) = arr(t + 1, j) Next j Next i fifth = temp End Function 

你会这样打电话:

 Sub ArrCombine() Dim ws As Worksheet Dim arr1() As Variant Dim rsltarr() As Variant Set ws = Sheets("Sheet1") 'Change to your sheet arr1 = ws.Range(ws.Range("A1"), ws.Range("A1").End(xlToRight).End(xlDown)).Value rsltarr = fifth(arr1) ws.Range("A1").End(xlToRight).Offset(, 1).Resize(UBound(rsltarr, 1) - 1, UBound(rsltarr, 2)).Value = rsltarr End Sub 

它将在活动工作表上输出,如下所示:

![在这里输入图片描述

这将使用任何尺寸范围。 唯一的限制是#ofRows ^ #ofColumns不大于工作表上可用的行数。

要通过公式来做到这一点,我build议这样的事情:

在第1行中,我们现在使用帮助单元格(为了加速更长的列表)

在列A到D中,我有一些variables(3到5),对于我的列表,我使用列F到I. F1只有=COUNTA(A:A) (复制到I1 – > =COUNTA(D:D)

 F2: =INDEX(A:A,MOD(INT((ROW()-2)/PRODUCT(G$1:$I$1)),F$1)+1) 

可以自动填充到H2

 G2: =INDEX(B:B,MOD(INT((ROW()-2)/PRODUCT(H$1:$I$1)),G$1)+1) H2: =INDEX(C:C,MOD(INT((ROW()-2)/PRODUCT(I$1:$I$1)),H$1)+1) 

I2得到一个稍微不同的公式:

 I2: =INDEX(D:D,MOD(ROW()-2,$I$1)+1) 

现在selectF2到I2并自动填充,直到列F再次显示第一个值…或者做a =PRODUCT(F1:H1)+1 – >这是您的最后一行;)

它可以简单地增强,因为除了右栏,公式是可自动填充的。 只需在列A和F之前插入一列,然后键入A即可。 列G可以从列H自动填充。不要忘记根据需要向下扩展列表。 如果您还有任何问题,请询问。

在这里输入图像说明

通过VBA做这个build议是这样的:

 Sub test() Dim inputRng As Range Set inputRng = ThisWorkbook.Sheets("Sheet1").Range("A:E") 'change this to fit your needs Dim inputVal() As Variant ReDim inputVal(1 To inputRng.Columns.Count) Dim holder() As Variant Dim i, j, k, xCol, xRow j = 1: k = 1 'load in values For Each xCol In inputRng.Columns xRow = Cells(1, xCol.Column).End(xlDown).Row ReDim holder(0 To xRow) holder(0) = xRow j = j * xRow For i = 1 To xRow holder(i) = xCol.Cells(i).Value Next inputVal(k) = holder k = k + 1 Next Dim outputVal() As Variant ReDim outputVal(1 To j, 1 To inputRng.Columns.Count) k = 1 For i = UBound(outputVal, 2) To 1 Step -1 For j = 0 To UBound(outputVal) - 1 outputVal(j + 1, i) = inputVal(i)((Int(j / k) Mod inputVal(i)(0)) + 1) Next k = k * inputVal(i)(0) Next Dim outputRng As Range Set outputRng = ThisWorkbook.Sheets("Sheet1").Range("G1") 'set here the first cell to start output outputRng.Resize(UBound(outputVal), UBound(outputVal, 2)).Value = outputVal End Sub 

它的devise目的是针对每个点使用不同的尺寸,并且只需要更改2条线以完全符合您的需求。 🙂

警告:如果一个地点只有一个项目,它会失败! (Excel可能不再响应)