Excel vba zu erstellen, jede mögliche Kombination von einer Reihe
Ich habe ein problem, dass ich nicht in der Lage zu finden, irgendwo auf dem web (es kann sein, aber ich kann es nicht finden, heh).
Ich habe eine Tabelle mit 13 Spalten von Daten. Jede Spalte enthält Variationen eines Parameters gehen muss in ein Gesamtsystem test der Fall.
Alle von Ihnen unterscheiden sich, wie
E:
101%
105%
110%
120%
J:
Obere S
Kopf L
Nachteil B
Premium V
Habe ich gesehen, dass mehrere Lösungen für die Kombination Thema, das verwendet geschachtelte Schleifen. Ich möchte zu meiden 13 geschachtelte Schleifen (aber das ist meine beste Wette im moment). Ich bin irgendwie ratlos, wie zum generieren von jeder einzigartige Kombination in der in jeder Spalte.
Ich bin mir nicht sicher, ob das genug Sinn für Euch. Ich hatte gehofft, jemand könnte zumindest zeigen mich in die richtige Richtung mit einer rekursiven Algorithmus. Ich möchte es dynamisch genug, um unterschiedliche Anzahlen von Spalten und Zeilen.
Vielen Dank für jede Hilfe, die Sie Jungs geben mir.
InformationsquelleAutor der Frage Kelvin | 2012-05-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da habe ich angeboten, eine ODBC-Ansatz, den ich dachte, ich sollte erläutern, es ist nicht sofort offensichtlich, wie dies zu tun. Und, in der Ehrlichkeit, ich musste erst wieder lernen der Prozess und dokumentieren es für mich.
Dies ist ein Weg zur Erzeugung von Kartesisches Produkt zwei oder mehrere eindimensionale arrays Benutzung von Excel und Microsoft Query.
Diese Instruktionen geschrieben wurden, mit XL2007 aber sollte mit geringem (wenn überhaupt) änderungen in jeder version.
Schritt 1
Organisieren die arrays in Spalten.
Wichtig: Jede Spalte sollte mit zwei "header" - Namen, wie gezeigt, in Fett unten. Der oberste name wird später interpretiert werden als "table-name". Der zweite name wird interpretiert als "Spaltenname". Das wird ersichtlich, wenige Schritte später.
Wählen Sie die einzelnen Daten-Bereich, in turn, einschließlich der beiden "headers", und drücken Sie
Ctrl+Shift+F3
. Klicken Sie nur aufTop row
in der "Namen Erstellen" - dialog und klicken Sie aufOK
.Einmal alle benannten Bereiche sind eingerichtet, speichern Sie die Datei.
Schritt 2
Daten | Externe Daten Abrufen | Aus Anderen Quellen | Von Microsoft Query
Wählen Sie
<New Data Source>
. In derChoose New Data Source
dialog:Einen Anzeigenamen für die Verbindung
wählen Sie die entsprechenden Microsoft Excel-Treiber
... dann
Connect
Schritt 3
Select Workbook...
dann suchen Sie nach Ihrer Datei.Schritt 4
Fügen Sie die "Spalten" aus dem "Tabellen". Sie können jetzt sehen, warum die "zwei-header" layout in Schritt 1 ist wichtig-es tricks, die der Fahrer in das Verständnis der Daten ordnungsgemäß.
Nächstes klicken Sie
Cancel
(wirklich!). Eventuell werden Sie aufgefordert, an dieser Stelle auf "weiter Bearbeiten in Microsoft Query?" (AntwortYes
), oder eine Beschwerde, dass die Verknüpfungen nicht dargestellt werden können, die im grafischen editor. Ignorieren Sie diese und Schmieden an...Schritt 5
Microsoft Query wird geöffnet, und standardmäßig die Tabellen, die Sie Hinzugefügt, wird sein Kreuz beigetreten. Dies erzeugt ein Kartesisches Produkt, das ist, was wir wollen.
Nun schließen MSQuery insgesamt.
Schritt 6
Sind Sie in das Arbeitsblatt zurückgegeben. Fast fertig, das verspreche ich! Tick
New worksheet
undOK
.Schritt 7
Cross-verknüpften Ergebnisse werden zurückgegeben.
InformationsquelleAutor der Antwort andy holaday
Nicht sicher, warum Sie abgeneigt sind, zu Schleifen. Siehe dieses Beispiel. Es dauerte weniger als eine Sekunde.
SNAPSHOT
HINWEIS: Das oben war ein kleines Beispiel. Ich habe einen test auf 4 Spalten mit 200 Zeilen jeweils. Die gesamte Kombination möglich, in einem solchen Szenario ist
1600000000
und es dauerte 16 Sekunden.In diesem Fall kreuzt die Excel-Zeilen-limit. Eine andere option, die ich denken kann, ist das schreiben der Ausgabe in eine text-Datei in ein solches Szenario. Wenn Sie Ihre Daten klein ist, dann können Sie Weg, ohne Verwendung von arrays und direkt schriftlich an den Zellen. 🙂 Aber bei großen Daten, die ich empfehlen würde, mit arrays.
InformationsquelleAutor der Antwort Siddharth Rout
Ich brauchte, das selbst mehrere Male, und schließlich gebaut.
Glaube ich, dass der code skaliert werden für insgesamt Anzahl der Spalten und eine beliebige Anzahl von unterschiedlichen Werten in Spalten (z.B. jede Spalte kann eine beliebige Anzahl von Werten)
Es übernimmt alle Werte in jeder Spalte eindeutig ist (wenn dies nicht der Fall, erhalten Sie doppelte Zeilen)
Es wird davon ausgegangen, Sie wollen cross-join-output, basierend auf was auch immer Zellen, die Sie aktuell ausgewählt haben (stellen Sie sicher, dass Sie Ihnen allen)
Es wird vorausgesetzt, Sie möchten die Ausgabe zu starten, eine Spalte nach der aktuellen Auswahl.
Wie es funktioniert (kurz):
ersten für jede Spalte und für jede Zeile: Es berechnet die Anzahl der Zeilen benötigt, um alle combos in N Spalten (Elemente in Spalte 1 * Elemente in der Spalte 2 ... * Elemente in der Spalte N)
Sekunde für jede Spalte: bezogen auf den Gesamt-combos, und die Gesamt-combos der vorherigen Spalten berechnet es zwei Schleifen.
ValueCycles (wie viele Male Sie haben, um durch alle Werte in der aktuellen Spalte)
ValueRepeats (wie viele Male zu wiederholen, jeder Wert in der Spalte nacheinander)
InformationsquelleAutor der Antwort spioter
Lösung basiert auf meinem zweiten Kommentar. In diesem Beispiel davon ausgegangen, dass Sie drei Spalten mit Daten, aber können angepasst werden, um zu behandeln.
Fange ich mit deinen Beispiel-Daten. Ich fügte hinzu, zählt Sie auf in der oberen Zeile für die Bequemlichkeit. Ich habe auch die Gesamtanzahl der Kombinationen (Produkt der zählt). Dies ist
Sheet1
:Auf
Sheet2
:Formeln:
A2:C2
(orange Zellen) sind fest codiert=0
Füllen von Zeile 3 nach unten so viele Zeilen, wie
Total
zeigt aufSheet1
InformationsquelleAutor der Antwort andy holaday
rufen Sie die Methode und in die aktuelle Ebene, die dekrementiert wird in der Methode (sorry für die DEU)
Beispiel:
InformationsquelleAutor der Antwort NDavid RU