몇 가지 데이터를 결합하여 고유 한 조합을 얻습니다.
행이나 집합 목록을 연결하는 것은 쉽지만, 각 가능한 순열을 입력 할 필요가 없을 것입니다 ... 그것은 시간 낭비 일 것입니다.
어떻게 컬럼 a, b, c의 가능한 조합을 모두 나열 할 수 있을까요? (각 열 내에서 옵션을 결합하고 싶지 않습니다.
예를 들어, "아드님"으로 시작하는 경우, 나는 아드님 - 앙 - 앙, 앙드레 - 앙 - 앙, 앙 - 앤 - 앙, 앙 - 앙 - 앙을 원해.

몇 가지 데이터를 결합하여 고유 한 조합을 얻습니다.
행이나 집합 목록을 연결하는 것은 쉽지만, 각 가능한 순열을 입력 할 필요가 없을 것입니다 ... 그것은 시간 낭비 일 것입니다.
어떻게 컬럼 a, b, c의 가능한 조합을 모두 나열 할 수 있을까요? (각 열 내에서 옵션을 결합하고 싶지 않습니다.
예를 들어, "아드님"으로 시작하는 경우, 나는 아드님 - 앙 - 앙, 앙드레 - 앙 - 앙, 앙 - 앤 - 앙, 앙 - 앙 - 앙을 원해.

답변:
가장 쉬운 방법은 목록을 독립적으로 가져 와서 배열에 저장하는 것입니다. 그런 다음 배열을 사용하여 가능한 모든 조합을 출력하십시오. 이 코드는 3 개의 다른 열로 출력되지만, 필요한 경우 하나의 셀에서 연결할 수 있습니다.
Sub combinations()
Dim c1() As Variant
Dim c2() As Variant
Dim c3() As Variant
Dim out() As Variant
Dim j, k, l, m As Long
Dim col1 As Range
Dim col2 As Range
Dim col3 As Range
Dim out1 As Range
Set col1 = Range("A1", Range("A1").End(xlDown))
Set col2 = Range("B1", Range("B1").End(xlDown))
Set col3 = Range("C1", Range("C1").End(xlDown))
c1 = col1
c2 = col2
c3 = col3
Set out1 = Range("E2", Range("G2").Offset(UBound(c1) * UBound(c2) * UBound(c3)))
out = out1
j = 1
k = 1
l = 1
m = 1
Do While j <= UBound(c1)
Do While k <= UBound(c2)
Do While l <= UBound(c3)
out(m, 1) = c1(j, 1)
out(m, 2) = c2(k, 1)
out(m, 3) = c3(l, 1)
m = m + 1
l = l + 1
Loop
l = 1
k = k + 1
Loop
k = 1
j = j + 1
Loop
out1.Value = out
End Sub
하나의 접근법은 "3 차원"테이블을 만들어 모든 조합을 캡처하는 것입니다. 목록에 11, 11 및 5 개의 항목이 있으므로 5 개의 11x11 표를 만듭니다. 다섯 가지 항목 각각에는 세 번째 항목의 항목 중 하나와 관련된 조합이 포함됩니다. 각 표의 셀은 첫 번째 열의 항목과 두 번째 열의 항목의 조합을 반영합니다.
표시하는 데이터가 다음과 같다고 가정 해 보겠습니다. A1:C11. 다음으로 시작하는 첫 번째 표 만들기 A15. 표의 각 항목에 대한 셀을 조회하는 데 사용될 색인 번호로 표의 행과 열에 레이블을 붙입니다. 따라서 테이블 1은 다음과 같이 설정됩니다.
[A] [B] [C] [D] [E] [F] [G] [H] [I] [J] [K] [L]
[15] 0 1 2 3 4 5 6 7 8 9 10
[16] 0
[17] 1
[18] 2
[19] 3
[20] 4
[21] 5
[22] 6
[23] 7
[24] 8
[25] 9
[26] 10
다음 공식 B16 다음과 같습니다.
=OFFSET($A$1,$A16,0,)&OFFSET($B$1,B$15,0,)&$C$1
이것을 복사하여 테이블의 모든 셀을 채 웁니다. 첫 번째 표현식은 A 열의 목록을 고정하고 표의 행 레이블에 해당하는 항목을 선택합니다 (첫 번째 행의 오프셋은 0이므로 목록의 첫 번째 항목을 참조 함). 두 번째 식은 B 열의 목록을 고정하고 열 레이블에 해당하는 항목을 선택합니다. 세 번째 식은 첫 번째 테이블의 모든 항목에 대해 C 열 목록의 첫 번째 값을 사용합니다. 식의 달러 기호는 수식을 표의 행 및 열 레이블에 고정하므로 수식을 복사하여 표를 채울 수 있으며 각 셀은 올바른 레이블을 참조합니다. 앰퍼샌드는 세 값을 연결합니다. 표시 할 하이픈과 같은 값 사이에 구분 기호를 사용하려면 수식의 앰퍼샌드 대신 다음을 사용하십시오.
&"-"&
그래서 B16 표시됩니다 adaren 또는 ad-ar-en. C16 표시됩니다 adren 또는 ad-r-en. B17 표시됩니다 adoaren 또는 ado-ar-en.
다른 테이블을 정확히 같은 방법으로 첫 번째 테이블 옆 또는 아래에 편리하게 만듭니다. 첫 번째 셀의 수식을 입력 할 때 해당 테이블의 행 및 열 레이블을 가리 킵니다. 예를 들어, 두 번째 테이블이 첫 번째 테이블 아래에서 시작하면, A30, 첫 번째 테이블 셀은 B31. 이 수식의 첫 번째 표현식은 $A31 대신에 $A16, 및 B$30 대신에 B$15. 두 번째 테이블의 마지막 표현식은 다음과 같습니다. $C$2 대신에 $C$1. 세 번째 테이블에서는 $C$3, 등등.
다섯 개의 표에는 목록 항목의 모든 조합이 포함됩니다.
테스트되지 않았기 때문에 Excel을 사용할 수 없습니다 (집에서 LibreOffice를 사용하면 LibreOffice에서 작동하지 않습니다).
그것이 작동하는 경우 ;-) 그것은 /해야한다 : "광고"는 A1 셀에 있고 나머지는 A1 셀에 있다고 가정합니다. '현재'셀이 A, B 및 C 열 각각의 빈 셀이 아니라면 D1을 채우고 결합 된 결과를 아래로 내립니다.
sub list_gen a = 1 d = 1 워크 시트 (1). 셀 (a, 1). 텍스트 & lt; & gt; "" astr = 워크 시트 (1). 셀 (a, 1). 텍스트 b = 1 워크 시트 (1). 셀 (b, 2). 텍스트 & lt; & gt; "" bstr = 워크 시트 (1). 셀 (b, 2). 텍스트 c = 1 워크 시트 (1). 셀 (c, 3). 텍스트 & lt; & gt; "" cstr = 워크 시트 (1). 셀 (c, 3). 텍스트 c = c + 1 워크 시트 (1). 셀 (d, 4) .text = astr + "-"+ bstr + "-"+ cstr d = d + 1 향하게 하다 b = b + 1 향하게 하다 a = a + 1 향하게 하다 엔드 서브
다음과 같은 목록이 있다고 가정하면 ... 매크로를 실행하면 지정한 형식으로 모든 가능한 순열을 갖게됩니다.
List_A List_B List_C
A1 B1 C1
A2 B2 C2
A3
Sub RandomCombo()
ListA = Application.WorksheetFunction.Transpose(Range("A2:A" & Cells(Rows.Count, "A").End(xlUp).Row).Value) 'data starts in 2nd row
ListB = Application.WorksheetFunction.Transpose(Range("B2:B" & Cells(Rows.Count, "B").End(xlUp).Row).Value) 'data starts in 2nd row
ListC = Application.WorksheetFunction.Transpose(Range("C2:C" & Cells(Rows.Count, "C").End(xlUp).Row).Value) 'data starts in 2nd row
counter = 2
For i = 1 To UBound(ListA)
For j = 1 To UBound(ListB)
For k = 1 To UBound(ListC)
Cells(counter, 4) = ListA(i) & "-" & ListB(j) & "-" & ListC(k)
counter = counter + 1
Next k
Next j
Next i
End Sub