我有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...
等等。
答案 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))不够,则添加一个元素。
答案 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
它将在活动工作表上输出,这个:
这将使用任何尺寸范围。唯一的限制是#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自动填充。不要忘记在需要时向下扩展列表。如果您还有任何疑问,请询问。
通过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来使该方法具有动态性。