2016-06-29 2 views
1

해결 방법을 찾을 수없는 문제가 있습니다.Excel/VBA/MS 범위의 가능한 조합을 모두 생성하는 쿼리

5 -> 10 인 스프레드 시트가 있습니까? 데이터 열 모두 다 다르지만 일부 열은 서로 관련되어 있습니다 (A3 = 1이면 B3 = A 및 C3 = a).

enter image description here

예상 결과 :

Expected result을 매개 변수]의> 6 변화와 나는 열 ..

초기 데이터를 모두 가능한 조합을 만들어야합니다 - 각 열은 3 포함

켈빈은 이전에 거의 비슷한 problem을 가졌지 만 나에게 도움이되지 않았습니다.

+0

당신거야 첫번째 그림은 5 개 테이블은 당신의 설명에 당신이 "5가 말하는 것을 의미한다 -> (10) 기둥?". 서로 다른 열 개수를 가진 5 개의 다른 테이블과 각 테이블에 하나의 ** 키 열 **이 있거나 여러 개의 ** 키 열 **이있는 단일 테이블이 있습니까? –

+0

안녕하세요. 여러 개의 열이 포함 된 표/스프레드 시트가 1 개 있습니다. 나는 그림을 바꿀 것이다. –

+0

몇 개의 열이 있고 어느 열이 키 열이고 어느 열이 값을 보유하고 있습니다. 그림은 5 열, 키, 키, 키, 값, 값을 보여줍니다. 이게 옳은 거니? –

답변

0

사진에서 볼 수있는 것부터 조합을 변경할 수있는 유일한 항목은 열 4에있는 것입니다 : (1; A; a; item4; # ¤), (2, B, B, item4, & # ¤), (3, C, C, item4, 이것은 참으로 경우 ¤ % &)

무엇 당신의 일을해야 다음 코드를하려고 노력하고 있습니다 :

Sub Combination() 

Dim i As Integer, j As Integer, k As Integer 

    For k = 0 To 2 'loop through (1 A a #¤), (2 B b &#¤) and (3 C c ¤%&) 

     j = 3 'column 4 items 

     For i = 0 To 6 Step (3) 'loop 3 by 3 (output starts in row 10) 

       Cells(10 + k + i, 1) = Cells(3 + k, 1) 
       Cells(10 + k + i, 2) = Cells(3 + k, 2) 
       Cells(10 + k + i, 3) = Cells(3 + k, 3) 
       Cells(10 + k + i, 5) = Cells(3 + k, 5) 

       Cells(10 + k + i, 4) = Cells(j, 4) 

     j = j + 1 

     Next i 

    Next k 

End Sub 
1

크로스 조인을 사용하여 SQL을 사용할 수 있습니다. 아래는 내가 만들고 테스트 한 작은 예제입니다. 당신은 당신의 필요에 적응시켜야 할 것입니다. 예제에서 test1과 test3은 첫 행에있는 sheet1의 열 이름입니다.

Sub SQLCombineExample() 
    Dim con 
    Dim rs 
    Set con = CreateObject("ADODB.Connection") 
    con.Open "Driver={Microsoft Excel Driver (*.xls)};" & _ 
      "DriverId=790;" & _ 
      "Dbq=" & ThisWorkbook.FullName & ";" & _ 
      "DefaultDir=" & ThisWorkbook.FullName & ";ReadOnly=False;" 
    Set rs = CreateObject("ADODB.Recordset") 
    Set rs = con.Execute("select distinct a.[test1], b.[test3] from [Sheet1$] as a , [Sheet1$] as b ") 
    Range("f1").CopyFromRecordset rs 
    Set rs = Nothing 
    Set con = Nothing 
End Sub 

Result

+0

참조 할 라이브러리를 언급하지 않았습니다. 최신 ActiveX Dataobjects 라이브러리를 시도하고 오류가 발생했습니다. 매개 변수가 너무 적습니다. –

+0

@ThomasInzina : 오른쪽 : Microsoft ActiveX Data Objects 6.1 Library를 사용했습니다. –

+0

알았어. 신난다 대답 그러나 당신은 모든 세부를 놓고 갔다. test1과 test3이 열 이름을 참조하고 ** a. *, b.test3을 [Sheet1 $]에서 a, [Sheet1 $]를 b **로 선택하도록 쿼리를 변경한다고 설명해야합니다. –

0
Sub CopyAllCombinationsToRange() 

    Dim arSource 
    Dim arResult 

    Dim i As Long, j As Long, combinationCount As Long, counter As Long 

    arSource = Range(Cells(2, 1), Cells(Rows.Count, 5).End(xlUp)).Value 

    combinationCount = UBound(arSource, 2) * UBound(arSource, 2) 
    ReDim arResult(4, combinationCount - 1) 

    For i = 1 To UBound(arSource, 1) 
     For j = 1 To UBound(arSource, 1) 

      arResult(0, counter) = arSource(i, 1) 
      arResult(1, counter) = arSource(i, 2) 
      arResult(2, counter) = arSource(i, 3) 
      arResult(3, counter) = arSource(i, 4) 
      arResult(4, counter) = arSource(j, 5) 
      counter = counter + 1 
     Next 
    Next 

    Sheet2.Range("A1").Resize(UBound(arResult, 2), 5) = WorksheetFunction.Transpose(arResult) 

End Sub 

enter image description here

관련 문제