Excel - 多列,不同的组合

时间:2016-02-09 15:08:32

标签: excel

我有4列,有4个不同的参数,如果这是正确的话。每个参数有大约3-5个变量。我想要做的是我想创建4个不同参数的所有可能组合,同时保持不同的列。所以我要说以下为例:

**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...

等等。

4 个答案:

答案 0 :(得分:0)

抱歉,我犯了一个可怕的错误。没有检查我的整个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))不够,则添加一个元素。

enter image description here

答案 1 :(得分:0)

这将为您提供所有可能的组合:

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

它将在活动工作表上输出,这个:

![enter image description here

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

答案 2 :(得分:0)

要按公式做,我建议这样的事情:

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

在列A到D中我有一些变量(3到5),对于我的列表,我使用列F到I. F1只有=COUNTA(A:A)(复制到I1 - &gt; =COUNTA(D:D))< / p>

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)

现在选择F2到I2并自动填充,直到F列再次显示第一个值...或者执行=PRODUCT(F1:H1)+1 - &gt;这是你的最后一行;)

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

enter image description here

通过VBA做这件事就是这样的:

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

它适用于每个位置的不同尺寸,您只需要更换2条线就可以完全满足您的需求。 :)

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

答案 3 :(得分:0)

假设您知道3列中的每列最多有5个选项(问题的标题为4,但示例显示3)。然后有可能将其重塑为以5为底的从0到124(5 ^ 3-1)的计数问题。方法如下。 在E1的=BASE(ROW()-1,5,3)处并将其向下拖动到第125行,以进行计数,并在左边的长度3处填充前导0。然后通过填充F到H列中的=mid(E1,1,1), =mid(E1,2,1), and =mid(E1,3,1)并将数字一直向下拖动来分离数字。 现在,通过在第I列中放置=index(A$1:A$5,1+F1),向右拖动到J和K列,并一直向下移动所有3列,选择相应的元组。 如果不是所有项目都有5个选项,则其中将包含一些不完整的项目。为了消除这些,我们将它们空白,并按如下方式将它们分类到末尾。在L1处放置=IF(COUNTA(I1:K1)=3, join(",",I1:K1),""),然后向下拖动到第125行。 在M1中,我们用=sort(L1:L125,1,false)将空容器排序到末尾(它还会对其他项目进行重新排序,但是无论如何,它们仍然存在)。最后,我们通过放入N1 =split(M1,",")并将其向下拖动到非空的三元组,再次拆分这些项目。 N,O和P列将包含所需的输出。 如果有人希望拆下建造这些脚手架的脚手架,则可以将完成工作的所有立柱都藏起来。毫无疑问,还可以将功能压缩为更复杂但更难以理解的功能。 如果有更多(或更少)选项,则该方法可以推广到其他基础,并且可以通过将前3列中的每一列的MAX替换为5来使该方法具有动态性。