2016-02-09 3 views
2

У меня есть 4 столбца с 4 различными параметрами, если это правильное слово. Каждый параметр имеет около 3-5 переменных. Я хочу, чтобы я создал ВСЕ возможные комбинации из 4 различных параметров, поддерживая разные столбцы. Так скажем, у меня есть следующие в качестве примера:Excel - несколько столбцов, различные комбинации

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

Извините, но совершил ужасную ошибку. Не проверял все мое превосходство. Вам нужно применить 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

+0

Из-за сложности этой формулы значение ответа было бы значительно увеличено, если бы вы прошли через шаги того, что он на самом деле делает. –

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 не превышает количество строк, доступных на листе.

0

Чтобы сделать это по формуле я предлагаю что-то вроде этого:

В строке 1 мы используем вспомогательную-клетку сейчас (чтобы ускорить его для более длинных списков)

В графах А D У меня есть некоторые переменные (от 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) 

Может быть autofilled Н2

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 -> это ваша последняя строка;)

его можно просто увеличить, потому что, за исключением правой колонки, формулы автоматически заполняются. просто вставьте столбец перед столбцом 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 линии, чтобы полностью соответствовать вашим потребностям , :)

Предупреждение: Если в одном месте только 1 элемент, он не сработает! (Excel больше не может отвечать)

Смежные вопросы