Erstellen Sie eine Liste der alle möglichen eindeutigen Kombinationen aus einem array (VBA)
Hintergrund: ich ziehe die Feldnamen aus einer Datenbank in ein array - ich habe diesen Teil getan, ohne ein problem, also ich habe bereits ein array mit allen Feldern (allfields ()), und ich habe eine zu zählen, wie viele Felder es gibt (numfields).
Ich versuche jetzt zu kompilieren, werden alle eindeutigen Kombinationen, die gemacht werden können, aus diesen verschiedenen Feldnamen. Zum Beispiel, wenn meine drei Felder NAME, DESCR, DATUM, möchte ich Folgendes zurück:
- NAME, DESCR, DATUM
- NAME, DESCR
- NAME, DATUM
- DESCR, DATUM
- NAMEN
- DESCR
- DATUM
Habe ich versucht, ein paar verschiedene Dinge für diese, darunter auch mehrere geschachtelte Schleifen, und ändern Sie die Antwort hier: Wie man alle möglichen Summe Kombinationen von array-Elementen in VB zu meinen Anforderungen passen, aber es scheint, als ob ich keinen Zugriff auf die erforderlichen libaries (System oder System.Sammlungen.Generische) auf meinem Arbeits-PC, da es nur mit VBA.
Hat jemand ein bisschen VB-code herumliegen, würde diesen Zweck erfüllen?
Vielen Dank!
Ich verwende es mit dem general Ledger accounting-Datenbanken, wo die GL selbst nicht über eine Transaktions-id / eindeutige ID-Feld, das ich verwenden kann, um Isolat-spezifische Transaktionen. Also, was ich versuche zu tun, ist zu finden die am besten geeignete Kombination von Feldern, um so ein eindeutiges ID-Feld, ohne manuelles testen aller möglichen Kombinationen selbst.
So sind Sie auf der Suche nach einer Kombination von Feldern, die aktuell - Daten angibt, ist einzigartig, eher als eine Menge von Feldern, die domain zeigt, ist einzigartig? Das klingt wie ein Rezept für eine Katastrophe. Wenn Sie wählen Sie eine Reihe von Feldern, wie ein Bezeichner, und es stellt sich heraus, dass es ist nicht die Straße hinunter, Sie finden möglicherweise selbst in einer Welt der Schmerzen.
Ich habe ein anderes Programm, dass ich verwenden können, um zu bestimmen, ob die bestimmte Kombination ist einzigartig - es nimmt jede Transaktion, basierend auf dem Bezeichner und Summen Sie alle, dann berechnet die Anzahl und den Prozentsatz der Transaktionen, die balance zu null. Je mehr Transaktionen, die balance auf null, desto besser ist die Kennung. Also das ist nicht das problem - es ist nur eine Frage der Zusammenstellung einer Liste von allen die einzigartige Kombination von Feldnamen, und dann werde ich in der Lage sein, um arbeiten von dort aus ganz leicht.
Sind Sie mit vb.net oder VBA?
InformationsquelleAutor dmacp | 2012-01-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hatte eine ähnliche Anforderung vor einigen Jahren. Ich erinnere mich nicht warum und ich habe nicht mehr den code aber ich erinnere mich an den Algorithmus. Für mich war dies eine einmalige übung, damit wollte ich einen einfachen code. Ich kümmerte sich nicht um Effizienz.
Gehe ich davon aus ein-basierten arrays, da es macht für eine geringfügig einfachere Erklärung. Da die VBA unterstützt-basierten arrays, das sollte OK sein, obwohl es eine einfache Einstellung auf null-basierte arrays, wenn das ist, was Sie wollen.
AllFields(1-NumFields) hält den Namen.
Haben eine Schleife: Für Inx = 1-2^NumFields - 1
Innerhalb der Schleife prüfen, Inx, als eine binäre Zahl mit bits nummeriert von 1 bis NumFields. Für jedes N zwischen 1 und NumFields, wenn bit N eine include-AllFields(N) in dieser Kombination.
Diese Schleife erzeugt 2^NumFields - 1 Kombinationen:
Die einzige Schwierigkeit, mit VBA ist immer der Wert von Bit N.
Extra Abschnitt
Jeder an gehen bei der Umsetzung bits von meinem Algorithmus, dachte ich, ich hätte besser zeigen, wie ich es getan hätte.
Dann fülle ich ein array von test-Daten mit einem fiesen Satz von Feld-Namen, da haben wir nicht gesagt, welche Zeichen in einem Namen.
Unterprogramm GenerateCombinations macht das Geschäft. Ich bin ein fan von Rekursion, aber ich glaube nicht, dass mein Algorithmus ist kompliziert genug, um seine Verwendung zu rechtfertigen in diesem Fall. Ich kehre das Ergebnis in ein verzweigtes array, die ich lieber Verkettung. Die Ausgabe von GenerateCombinations ist die Ausgabe in das Direktfenster zu zeigen, Ihren Ausgang.
Diese routine zeigt GenerateCombinations
GenerateCombinations macht das Geschäft.
InformationsquelleAutor Tony Dallimore
Hier ist etwas code, der das tut, was Sie wollen. Es weist keine oder eine zu jedem element und verbindet die Elemente, die zugeordnet sind, ein. Mit vier Elementen, zum Beispiel, Sie haben 2^4 Kombinationen. Dargestellt als Nullen und Einsen, es würde Aussehen wie
Dieser code erstellt ein array(maInclude) repliziert alle 16 dieser Szenarien und verwendet die entsprechenden mvArr element verketten der Ergebnisse.
Rekursion macht mein Kopf weh, aber es ist sicher mächtig. Dieser code wurde angepasst von Naishad Rajani, deren original-code finden Sie unter http://www.dailydoseofexcel.com/archives/2005/10/27/which-numbers-sum-to-target/
Wie ist dies ein Duplikat Ihrer Lösung? Die nur oberflächliche ähnlichkeit, ist der Einsatz von 0 und 1 zur Darstellung einer booleschen Wert (zählen/nicht zählen Feld-name), die ist ein generisches Teil dieses Problems.
Corbett. Zwei Faktoren, die hinter meinem bitteren Kommentar. (1) Gestern sah ich eine Frage mit der Antwort als Kommentar. Eine Stunde oder so später jemand dupliziert hatte den Kommentar als eine Antwort. Ich sah dies als einen bloßen Versuch, zu stehlen jemand anderes Kredit-und Punkte. (2) ich beendete die Arbeit am späten Abend (frühen morgen) und ich hatte eine Letzte überprüfung von Stack Overflow, bevor Sie zu Bett. Ich sah, was auf den ersten Blick erschien eine plumpe Umsetzung meines Algorithmus ohne Kredit. Daher mein bitterer Kommentar.
Ich war der Autor von rival Antworten. Manchmal zwei von uns haben eindeutig die Zeit genommen, um erstellen Sie eine detaillierte Antwort, die wir veröffentlicht haben, ohne wissen des anderen. Wenn ich einen Beitrag Rivalen zu beantworten, als ich gesehen habe, die frühere Antwort, die erste, die ich bestätigen, dass die frühere Antwort und erklären, warum ich bin Entsendung ein Rivale. Ich denke, vielleicht meine Antwort ist, überlegen; öfter, es ist einfach anders und wollen alert die OP an einem alternativen Ansatz könnte sein, mehr geeignet. Ich halte die Bestätigung und eine Erklärung notwendig, mit freundlicher Genehmigung.
Ein dickes Lob für Ihre gütige einfahren. Während ich verstehe deine frustration, ich habe festgestellt, dass in den Foren, in denen ich involviert war, in die "Stammgäste" in der Regel den Ton für das, was akzeptabel ist, die oft in der Excel-Raum ist ein höherer standard als das Allgemeine forum. Die Täter neigen dazu, Website-Neulinge oder unregelmäßigen Mitwirkenden, ich denke, in diesem Fall ein check von Dick ' s aufnehmen müssen möglicherweise neu kalibriert Ihren ärger.
InformationsquelleAutor
bauen auf Thorstens Antwort:
(wo A = 4, B = 2, C = 1)
(der folgende pseudocode)
InformationsquelleAutor Harry