Sortieren eines mehrdimensionalen Arrays in VBA

8

Ich habe das folgende Array Dim myArray(10,5) as Long definiert und möchte es sortieren. Was wäre die beste Methode, das zu tun?

Ich werde viele Daten wie eine 1000 x 5-Matrix handhaben müssen. Es enthält hauptsächlich Zahlen und Datumsangaben und muss nach einer bestimmten Spalte sortiert werden.

    
BlackLabrador 02.02.2011, 10:18
quelle

6 Antworten

16

Hier ist ein mehrspaltiges und einspaltiges QuickSort für VBA, das nach einem Codebeispiel von Jim Rech im Usenet geändert wurde.

Anmerkungen:

Sie werden feststellen, dass ich ein Los defensiveres Coding verwende, als Sie es in den meisten Codebeispielen im Internet finden: Dies ist ein Excel-Forum, und Sie haben es Nullen und leere Werte antizipieren ... Oder verschachtelte Arrays und Objekte in Arrays, wenn Ihr Quell-Array aus einer Echtzeit-Marktdatenquelle eines Drittanbieters stammt.

Leere Werte und ungültige Elemente werden an das Ende der Liste gesendet.

Ihr Anruf wird sein:

 QuickSort MyArray,,,2
... Die Spalte '2' wird übergeben, um die optionalen Parameter zu sortieren und auszuschließen, die die obere und untere Grenze der Suchdomäne passieren.

[EDITED] - ein seltsamer Formatierungsfehler im & amp; LT; Code & gt; Tags, die ein Problem mit Hyperlinks in Code-Kommentaren haben.

Der Hyperlink, den ich ausgeschnitten habe, war Eine Array-Variante in VBA erkennen .

%Vor%

... und die einspaltige Array-Version:

%Vor%

Ich habe BubbleSort für diese Art von Dingen verwendet, aber es verlangsamt sich stark, nachdem das Array 1024 Zeilen überschreitet. Ich füge den unten stehenden Code als Referenz bei: Bitte beachten Sie, dass ich keinen Quellcode für ArrayDimensions zur Verfügung gestellt habe, so dass dieser nicht für Sie kompiliert wird, es sei denn Sie refaktorisieren ihn - oder teilen ihn in Array- und Vektorversionen auf. p> %Vor%

Diese Antwort ist möglicherweise etwas verspätet eingegangen, um Ihr Problem zu lösen, wenn Sie es benötigen, aber andere Leute werden es aufheben, wenn sie nach Antworten für ähnliche Probleme suchen.

    
Nigel Heffernan 24.02.2011, 11:47
quelle
8

Der schwierige Teil ist, dass VBA keine einfache Möglichkeit bietet, Zeilen in einem 2D-Array zu tauschen. Für jeden Tausch musst du 5 Elemente durchlaufen und sie austauschen, was sehr ineffizient ist.

Ich vermute, dass ein 2D-Array wirklich nicht das ist, was Sie trotzdem verwenden sollten. Hat jede Spalte eine bestimmte Bedeutung? Wenn ja, sollten Sie kein Array eines benutzerdefinierten Typs oder ein Array von Objekten verwenden, die Instanzen eines Klassenmoduls sind? Selbst wenn die 5 Spalten keine spezifischen Bedeutungen haben, könnten Sie dies trotzdem tun, aber definieren Sie das UDT oder das Klassenmodul so, dass es nur ein einzelnes Mitglied hat, das ein 5-Elemente-Array ist.

Für den Sortieralgorithmus selbst würde ich eine einfache Einfügesortierung verwenden. 1000 Einträge sind eigentlich nicht so groß, und Sie werden wahrscheinlich den Unterschied zwischen einer Einfügungssortierung und einer Schnellsortierung nicht bemerken, solange wir sichergestellt haben, dass jeder Austausch nicht zu langsam ist. Wenn Sie eine Schnellsortierung verwenden, müssen Sie sie sorgfältig codieren, um sicherzustellen, dass Ihnen der Stapelspeicher nicht ausgeht. Dies ist zwar möglich, aber kompliziert, und Quick Sort ist schwierig genug schon.

Wenn Sie also ein Array von UDTs verwenden und davon ausgehen, dass das UDT die Varianten Field1 bis Field5 enthält und wir beispielsweise nach Field2 sortieren wollen, sieht der Code vielleicht so aus ...

%Vor%     
Steve Jorgensen 10.02.2011 10:20
quelle
1

manchmal ist die hirnloseste Antwort die beste Antwort.

  1. Leeres Blatt hinzufügen
  2. Laden Sie Ihr Array auf dieses Blatt herunter
  3. fügen Sie die Sortierfelder
  4. hinzu
  5. Übernehmen Sie die Sortierung
  6. Laden Sie die Sheet-Daten wieder in Ihr Array zurück, es wird dieselbe Dimension haben
  7. lösche das Blatt

tadaa. Sie werden keine Programmierpreise gewinnen, aber es erledigt den Job schnell.

    
swyx 13.12.2011 03:37
quelle
0

Ich werde Steves Herangehensweise ein bisschen anders Code anbieten.

Alle gültigen Punkte zur Effizienz, aber um ehrlich zu sein ... als ich nach einer Lösung suchte, hätte mir die Effizienz weniger am Herzen liegen. Seine VBA ... Ich behandle es wie es verdient.

Sie möchten ein 2-D-Array sortieren. Einfache einfache Dirty-Simple-Einfügesortierung, die ein Array variabler Größe akzeptiert und nach einer ausgewählten Spalte sortiert.

%Vor%     
giveemheller 29.04.2015 15:45
quelle
0

Für was es wert ist (Ich kann Code an dieser Stelle nicht zeigen ... lassen Sie mich sehen, wenn ich es zum Posten bearbeiten kann), habe ich ein Array von benutzerdefinierten Objekten erstellt (so dass jede der Eigenschaften mit dem Element kommt, das ist) sortiert nach), bevölkerte eine Reihe von Zellen mit jedem Element Objekteigenschaften von Interesse dann verwendet die Excel-Sortierfunktion durch VBA, um die Spalte zu sortieren. Ich bin mir sicher, dass es wahrscheinlich eine effizientere Methode gibt, es zu sortieren, anstatt es in Zellen zu exportieren, ich habe es noch nicht herausgefunden. Das hat mir sehr geholfen, denn als ich eine Dimension hinzufügen musste, fügte ich einfach eine Eigenschaft let und get für die nächste Dimension des Arrays hinzu.

    
Dan 30.12.2016 14:42
quelle
-1

Es scheint mir, dass der obige QuickSort-Code keine Leerzeichen verarbeiten kann. Ich habe ein Array mit Zahlen und Leerzeichen. Wenn ich dieses Array sortiere, werden die Datensätze mit Leerzeichen zwischen den Datensätzen mit Zahlen vermischt. Ich habe viel Zeit gebraucht, um es herauszufinden, also ist es wahrscheinlich gut, es zu beachten, wenn Sie diesen Code verwenden.

am besten, Marcel

    
Marcel 21.08.2015 13:48
quelle

Tags und Links