2016-06-29 6 views
1

Ich habe ein Problem, für das ich keine Lösung finden konnte.Excel/VBA/MS Abfrage, um jede mögliche Kombination eines Bereichs zu erstellen

Ich habe eine Tabelle mit 5 -> 10? Spalten von Daten. Alle sind unterschiedlich, aber einige Spalten sind miteinander verwandt (wenn A3 = 1, dann B3 = A und C3 = a). Jede Spalte enthält 3 -> 6 Variationen eines Parameter und ich brauche alle möglichen Kombinationen von ihnen zu schaffen ..

Erste Daten in den Spalten:

enter image description here

Erwartetes Ergebnis:

Expected result

Kelvin hatte fast problem vorher ähnlich, aber das hat nicht für mich funktioniert.

+0

Sie über erstes Diagramm bedeutet, dass ihr sind 5 Tabellen und in Ihrer Beschreibung sagen Sie es „5 -> 10 Säule?". Gibt es 5 verschiedene Tabellen mit unterschiedlichen Spaltenzählungen und eine einzelne ** Schlüsselspalte ** in jeder Tabelle oder gibt es eine einzelne Tabelle mit mehreren ** Schlüsselspalten **? –

+0

Hallo. Es gibt 1 Tabelle/Tabellenkalkulation, die mehrere Spalten enthält. Ich werde das Bild ändern. –

+0

Wie viele Spalten gibt es und welche sind Schlüsselspalten und welche sind die Werte. Ihr Bild zeigt 5 Spalten, Schlüssel, Schlüssel, Schlüssel, Wert, Wert. Ist das richtig? –

Antwort

0

Von dem, was ich in Ihren Bildern sehe, ist das einzige Element, das Kombination ändern kann, das in Spalte 4: (1; EIN ; ein ; item4; # ¤), (2; B; b; item4; & # ¤) und (3; C; c; item4; ¤% &)

Wenn dies tatsächlich, was Ihr versuchen, den folgenden Code zu tun, sollte funktionieren :

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

das können Sie verbinden mit einem Kreuz SQL. Unten ist ein kleines Beispiel, das ich gemacht und getestet habe. Sie müssen es an Ihre Bedürfnisse anpassen. In meinem Beispiel sind test1 und test3 die Spaltennamen in der ersten Zeile von 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

Sie haben nicht erwähnt, auf welche Bibliothek verwiesen werden soll. Ich habe die neueste ActiveX Dataobjects Bibliothek ausprobiert und einen Fehler bekommen. Zu wenige Parameter –

+0

@ThomasInzina: rechts: Ich habe Microsoft ActiveX Data Objects 6.1 Bibliothek verwendet. –

+0

Okay, ich habe es. Tolle Antwort, aber Sie haben alle Details weggelassen. Sie sollten erklären, dass sich test1 und test3 auf Spaltennamen beziehen und Ihre Abfrage auf ** select distinct a. *, B.test3 von [Sheet1 $] als a, [Sheet1 $] als b ** ändern. –

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 

Beispiel

enter image description here

Verwandte Themen