Excel에서 세 열의 모든 데이터 조합 결합


0

몇 가지 데이터를 결합하여 고유 한 조합을 얻습니다.

행이나 집합 목록을 연결하는 것은 쉽지만, 각 가능한 순열을 입력 할 필요가 없을 것입니다 ... 그것은 시간 낭비 일 것입니다.

어떻게 컬럼 a, b, c의 가능한 조합을 모두 나열 할 수 있을까요? (각 열 내에서 옵션을 결합하고 싶지 않습니다.

예를 들어, "아드님"으로 시작하는 경우, 나는 아드님 - 앙 - 앙, 앙드레 - 앙 - 앙, 앙 - 앤 - 앙, 앙 - 앙 - 앙을 원해.

enter image description here


이 의견은 Excel에는 도움이되지 않지만 Linux를위한 "위기"라는 오픈 소스 단어 목록 생성기가 있습니다.
bitsmack

마음에 떠오른 첫 번째 아이디어는 지나치게 복잡했고 Ax, Bx 및 Cx가있는 세 개의 셀 세트를 얻기 위해 난수 생성을 포함했습니다. 그렇다면 연결시 Ax 텍스트를 셀 값으로 변환하는 방법을 알아낼 수 없었습니다 (실제 효과가 없었습니다 ...)
James

당신은 "무작위"라는 용어를 계속 사용합니다. 몇 가지 임의의 조합, 가능한 모든 조합 또는 가능한 모든 조합을 임의의 순서로 찾으십니까?
fixer1234

@ 레이 스타 프린 (Raystafarian) - 귀하의 제안을 보여주는 답변을 게시 할 수 있습니까?
fixer1234

답변:


2

출처 원본 : 엑셀 SO에 이리 . 그의 코드.

가장 쉬운 방법은 목록을 독립적으로 가져 와서 배열에 저장하는 것입니다. 그런 다음 배열을 사용하여 가능한 모든 조합을 출력하십시오. 이 코드는 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

0

하나의 접근법은 "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, 등등.

다섯 개의 표에는 목록 항목의 모든 조합이 포함됩니다.


0

테스트되지 않았기 때문에 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
  향하게 하다

엔드 서브 

0

다음과 같은 목록이 있다고 가정하면 ... 매크로를 실행하면 지정한 형식으로 모든 가능한 순열을 갖게됩니다.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.