Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

QuickSort für ObjectScripting.Dictionary

Forumthread: QuickSort für ObjectScripting.Dictionary

QuickSort für ObjectScripting.Dictionary
24.03.2020 15:00:47
Thomas
Guten Tag hier im Forum,
habe zwei Tage im Forum über QuickSort für CreateObject("Scripting.Dictionary") gesucht und das Ergebnis in folgendem Code erstellt.
Meine Bitte, ob einer der darin erfahreneren VBA-ler das durchschauen kann, ob das sauber definiert ist, bevor ich das in einem größeren Tools einfüge.
Private Sub UserForm_Combobox_Fuellen()
'ComboBoxes füllen ohne doppelte Einträge und sortieren
'Alle Spalten haben die gleiche Anzahl von Einträgen
'Die Werte aus Spalte D, E und R sollen in ComboBoxen: Start_Hlst, SollZeit, und Hpkt _
eingelesen werden:
Dim hsh1 As Object, hsh2 As Object, hsh3 As Object
Dim I As Long, lngLR As Long, vArray As Variant
Set hsh1 = CreateObject("Scripting.Dictionary")
Set hsh2 = CreateObject("Scripting.Dictionary")
Set hsh3 = CreateObject("Scripting.Dictionary")
With Sheets("Tabelle1")
For I = 5 To .Cells(.Rows.Count, 4).End(xlUp).Row   'letzte Zeile in Spalte D
'"I" ist eine Variable die einen Wert aufnehmen soll
'"5" verweist auf die erste Zeile mit Daten (1-4 Datenkopf)
'"Cells" verweist auf die Zellen
'"Rows.Count" ist eine Funktion welche die Anzahl Zeilen im Tabellenblatt zurückgibt
'",4" in welcher Spalte gesucht werden soll (hier D)
'".End" weisst EXCEL an, dass es dort beginnen soll zu zählen
'"xlUp" ist die Richtung in welche EXCEL suchen soll
'".Row" gibt die erste Zeile von unten zurück, wo etwas drinsteht
hsh1(.Cells(I, 4).Text) = 0                     ' = Spalte D
hsh2(.Cells(I, 5).Text) = 0                     ' = Spalte E
hsh3(.Cells(I, 18).Text) = 0                    ' = Spalte R
Next
End With
'hash.keys Einträge: hsh1 , hsh2 und hsh3 sortieren
vArray = hsh1.keys
Call QuickSort(vArray, 0, UBound(vArray))
hsh_1 = vArray
vArray = hsh2.keys
Call QuickSort(vArray, 0, UBound(vArray))
hsh_2 = vArray
vArray = hsh3.keys
Call QuickSort(vArray, 0, UBound(vArray))
hsh_3 = vArray
UserForm2.cmb_Start_Hlst.List = Application.Transpose(hsh_1)
UserForm2.cmb_SollZeit.List = Application.Transpose(hsh_2)
UserForm2.cmb_Hpkt.List = Application.Transpose(hsh_3)
UserForm2.Show
Unload UserForm2
Set hsh1 = Nothing
Set hsh2 = Nothing
Set hsh3 = Nothing
End Sub
Private Sub QuickSort(vArray As Variant, inLow As Long, inHi As Long)
Dim pivot   As Variant
Dim tmpSwap As Variant
Dim tmpLow  As Long
Dim tmpHi   As Long
tmpLow = inLow
tmpHi = inHi
pivot = vArray((inLow + inHi) \ 2)
While (tmpLow  inLow)
tmpHi = tmpHi - 1
Wend
If (tmpLow 
Danke schon mal im Voraus
Gruß Thomas
Anzeige

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: QuickSort für ObjectScripting.Dictionary
24.03.2020 16:49:42
Nepumuk
Hallo,
1. Die 2. Abfrage (And tmpLow inLow) im Quicksort ist überflüssig.
2. Warum übergibst du das sortierte Array noch an ein weiteres (welches auch nicht deklariert ist) anstatt direkt an die ListBoxen?
3. Das Transponieren ist nicht notwendig das es sich um eindimensionale Arrays handelt.
Gruß
Nepumuk
Anzeige
AW: QuickSort für ObjectScripting.Dictionary
24.03.2020 17:00:25
Thomas
Hallo Nepumuk,
danke für deine Rückmeldung, werde es anpassen.
Gruß Thomas.
;
Anzeige

Infobox / Tutorial

QuickSort für ObjectScripting.Dictionary in VBA


Schritt-für-Schritt-Anleitung

Um ein Dictionary in Excel VBA zu sortieren, kannst du die CreateObject("Scripting.Dictionary")-Methode verwenden, um ein Dictionary zu erstellen. Hier ist eine Schritt-für-Schritt-Anleitung, wie du dies mit QuickSort umsetzt:

  1. Erstelle das Dictionary:

    Dim hsh As Object
    Set hsh = CreateObject("Scripting.Dictionary")
  2. Füge Werte hinzu:

    hsh("Schlüssel1") = "Wert1"
    hsh("Schlüssel2") = "Wert2"
  3. Definiere die QuickSort-Funktion:

    Private Sub QuickSort(vArray As Variant, inLow As Long, inHi As Long)
       Dim pivot As Variant
       Dim tmpLow As Long
       Dim tmpHi As Long
       Dim tmpSwap As Variant
    
       tmpLow = inLow
       tmpHi = inHi
       pivot = vArray((inLow + inHi) \ 2)
       ' Implementiere den Sortieralgorithmus hier...
    End Sub
  4. Rufe QuickSort auf:

    Dim keysArray As Variant
    keysArray = hsh.Keys
    Call QuickSort(keysArray, LBound(keysArray), UBound(keysArray))
  5. Verwende die sortierten Werte:

    For i = LBound(keysArray) To UBound(keysArray)
       Debug.Print keysArray(i)
    Next i

Häufige Fehler und Lösungen

  • Fehler: Überflüssige Abfragen im Code
    Lösung: Prüfe die Bedingungen in deiner QuickSort-Funktion. Überflüssige Abfragen wie And tmpLow < inLow sollten entfernt werden.

  • Fehler: Unklare Variablenübergabe
    Lösung: Stelle sicher, dass du das sortierte Array direkt an die ListBoxen übergibst, ohne zusätzliche nicht deklarierte Variablen.

  • Fehler: Transponierung nicht notwendig
    Lösung: Da es sich um eindimensionale Arrays handelt, ist das Transponieren überflüssig. Du kannst die Werte direkt verwenden.


Alternative Methoden

Wenn du keine QuickSort-Implementierung verwenden möchtest, gibt es alternative Methoden, um ein Dictionary in Excel VBA zu sortieren:

  • Sortieren mit der Sort-Methode (für Arrays): Verwende die Sort-Methode in Kombination mit einem Array, um die Werte zu sortieren.
  • Einfache Schleifen: Implementiere eine einfache Schleife, um die Schlüssel und Werte zu vergleichen und in eine neue Struktur zu übertragen.

Praktische Beispiele

Hier ist ein praktisches Beispiel, wie du ein Dictionary mit CreateObject("Scripting.Dictionary") erstellst und mit QuickSort sortierst:

Sub BeispielSortierung()
    Dim hsh As Object
    Set hsh = CreateObject("Scripting.Dictionary")

    hsh("Banane") = 1
    hsh("Apfel") = 2
    hsh("Orange") = 3

    Dim keysArray As Variant
    keysArray = hsh.Keys

    Call QuickSort(keysArray, LBound(keysArray), UBound(keysArray))

    Dim i As Long
    For i = LBound(keysArray) To UBound(keysArray)
        Debug.Print keysArray(i)
    Next i
End Sub

Tipps für Profis

  • Verwende CreateObject("Scripting.Dictionary") nur, wenn du ein Dictionary benötigst, das nicht auf die Größe von Arrays beschränkt ist.
  • Achte auf die Typisierung der Variablen, um Laufzeitfehler zu vermeiden.
  • Teste deine QuickSort-Implementierung mit verschiedenen Datentypen, um sicherzustellen, dass sie robust ist.

FAQ: Häufige Fragen

1. Wie kann ich ein Dictionary in Excel VBA sortieren?
Du kannst ein Dictionary mit der CreateObject("Scripting.Dictionary")-Methode erstellen und anschließend die Werte in ein Array übertragen, das du mit QuickSort sortierst.

2. Ist QuickSort die beste Methode zum Sortieren eines Dictionaries?
QuickSort ist effizient, aber du kannst auch andere Sortieralgorithmen oder die Sort-Methode verwenden, je nach deinen Anforderungen und der Größe des Dictionaries.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige