Zweidimensionales Array sortieren

Bild

Betrifft: Zweidimensionales Array sortieren
von: Erik Kaubitzsch
Geschrieben am: 27.07.2015 11:09:06

Liebe Gemeinde,
ich habe bereits hier einige Fragen gestellt und immer eine nützliche Antwort erhalten. Ich habe schon seit längerem nach einer Prozedur/Funktion gesucht, die ein zweidimensionales Array sortiert und dabei eine bestimmte Spalte annimmt, sowie die Sortierrichtung (aufsteigend/absteigend) beachtet.
Ich bin nun fündig geworden und habe die Prozedur, die nach der QuickSort-Methode arbeitet, noch etwas angepasst, so dass sie - so denke ich - dem ein oder anderem nützlich erscheinen mag:
Der Code


'------------------------------------------------------------------------------------------
'|
'|  Prozedur: multi_sort_array
'|  Parameter:
'|      arrData, VARIANT, Array, zweidimensional: Array, das die Daten enthält, die
'|      sortiert werden sollen
'|      lngColumn, LONG: Spaltennummer, die angibt, welche Spalte im Array arrData
'|      sortiert werden soll, auf Nullbastierung achten! Spalte 1 = 0
'|      typSort, EXCELKONSTANTE, optional: Gibt die Sortierreihenfolge an.
'|      Standard: aufsteigend
'|      lngStart, LONG, optional: technischer Parameter, wird nur zur Rekursion benötigt
'|      lngEnd, LONG, optional: technischer Parameter, wird nur zur Rekursion benötigt
'|
'| Quelle: http://www.vbarchiv.net/tipps/tipp_1881-2-dimensionales-array- _
 _
 _
 _
 _
 _
 _
 _
nach-beliebiger-spalte-sortieren.html
'|  Erklärung der QuickSort-Methode: https://msdn.microsoft.com/de-de/library/Bb979305.aspx
'|
'------------------------------------------------------------------------------------------
Private Sub multi_sort_array( _
    arrData As Variant, _
    Optional ByVal lngColumn As Long = 0, _
    Optional typSort As XlSortOrder = 1, _
    Optional ByVal lngStart As Long = -1, _
    Optional ByVal lngEnd As Long = -1)
    Dim i As Long
    Dim j As Long
    Dim h As Variant
    Dim x As Variant
    Dim u As Long
    Dim lb_dim As Integer
    Dim ub_dim As Integer
  
    If lngStart = -1 Then lngStart = LBound(arrData)
    If lngEnd = -1 Then lngEnd = UBound(arrData)
    lb_dim = LBound(arrData, 2)
    ub_dim = UBound(arrData, 2)
 
    i = lngStart: j = lngEnd
    x = arrData((lngStart + lngEnd) / 2, lngColumn)
    
    Do
        If typSort = xlAscending Then
            While (arrData(i, lngColumn) < x): i = i + 1: Wend
            While (arrData(j, lngColumn) > x): j = j - 1: Wend
        Else
            While (arrData(i, lngColumn) > x): i = i + 1: Wend
            While (arrData(j, lngColumn) < x): j = j - 1: Wend
        End If
        If (i <= j) Then
            For u = lb_dim To ub_dim
                h = arrData(i, u)
                arrData(i, u) = arrData(j, u)
                arrData(j, u) = h
            Next u
            i = i + 1: j = j - 1
        End If
    Loop Until (i > j)
 
    If (lngStart < j) Then multi_sort_array arrData, lngColumn, typSort, lngStart, j
    If (i < lngEnd) Then multi_sort_array arrData, lngColumn, typSort, i, lngEnd
End Sub

Das bringt sie
Es gibt im Netz einige verschiedene Umsetzungen der Quicksort-Methode, nur leider fand ich nie das, was ich brauchte: Eine Prozedur mit der ich ein zweidimensionales Array nach einer bestimmten Spalte entweder absteigend oder aufsteigend sortieren konnte.
Nun habe ich alles zusammengefunden und entsprechend angepasst.
Ich hoffe, es hilft und freue mich, wenn du mir eine Rückmeldung gibst, falls an dem Code irgendetwas nicht stimmen sollte (oder vielleicht es noch etwas besseres gibt). Ich lerne gerne.
Gruß
Erik

Bild

Betrifft: AW: Zweidimensionales Array sortieren
von: Rudi Maintaire
Geschrieben am: 27.07.2015 11:14:09
Hallo,
es gibt schon seit 10 Jahren eine sehr gute Lösung von Nepumuk.
Siehe http://www.online-excel.de/excel/singsel_vba.php?f=97
Gruß
Rudi

 Bild

Beiträge aus den Excel-Beispielen zum Thema "Zweidimensionales Array sortieren"