Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Zweidimensionales Array sortieren

Zweidimensionales Array sortieren
27.07.2015 11:09:06
Erik
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): j = j - 1: Wend
Else
While (arrData(i, lngColumn) > x): i = i + 1: Wend
While (arrData(j, lngColumn)  j)
If (lngStart 

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

Anzeige

1
Beitrag zum Forumthread
Beitrag zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zweidimensionales Array sortieren
27.07.2015 11:14:09
Rudi
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
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Zweidimensionales Array sortieren in Excel VBA


Schritt-für-Schritt-Anleitung

Um ein zweidimensionales Array in Excel VBA zu sortieren, kannst Du die QuickSort-Methode verwenden. Hier ist eine Schritt-für-Schritt-Anleitung:

  1. Erstelle ein neues VBA-Modul:

    • Öffne Excel, drücke ALT + F11, um den VBA-Editor zu öffnen.
    • Klicke mit der rechten Maustaste auf "VBAProject (DeineArbeitsmappe)" und wähle Einfügen > Modul.
  2. Füge den Code ein:

    • Kopiere den folgenden VBA-Code in das Modul:
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 x As Variant
    If lngStart = -1 Then lngStart = LBound(arrData)
    If lngEnd = -1 Then lngEnd = UBound(arrData)
    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
            ' Swap
            Dim temp As Variant
            temp = arrData(i, 0)
            arrData(i, 0) = arrData(j, 0)
            arrData(j, 0) = temp
            i = i + 1
            j = j - 1
        End If
    Loop While 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
  1. Rufe die Funktion auf:
    • Du kannst die Funktion multi_sort_array in Deinem VBA-Projekt aufrufen, indem Du ein zweidimensionales Array übergibst und die gewünschte Spalte sowie die Sortierreihenfolge angibst.

Häufige Fehler und Lösungen

  • Fehler: "Typ nicht definiert"

    • Lösung: Stelle sicher, dass Du die richtige Excel-Konstante für typSort verwendest. Möglicherweise musst Du XlSortOrder in Deinem Code angeben.
  • Fehler: "Index außerhalb des zulässigen Bereichs"

    • Lösung: Überprüfe die Grenzen Deines Arrays. Achte darauf, dass die Indizes korrekt sind.

Alternative Methoden

Wenn Du nach Alternativen suchst, um ein mehrdimensionales Array in Excel zu sortieren, kannst Du auch die Sort-Methode in VB.NET verwenden. Diese ist besonders nützlich, wenn Du mit großen Datenmengen arbeitest und die Leistung optimieren möchtest.

Array.Sort(array)

In Excel VBA gibt es keine direkte Sort-Methode für Arrays, weshalb die QuickSort-Methode eine beliebte Wahl ist.


Praktische Beispiele

Hier ist ein einfaches Beispiel, wie Du ein zweidimensionales Array definieren und sortieren kannst:

Sub BeispielSortieren()
    Dim data(1 To 3, 1 To 2) As Variant
    data(1, 1) = "Apfel"
    data(1, 2) = 5
    data(2, 1) = "Banane"
    data(2, 2) = 3
    data(3, 1) = "Kirsche"
    data(3, 2) = 8

    Call multi_sort_array(data, 2, xlAscending)

    Dim i As Long
    For i = LBound(data, 1) To UBound(data, 1)
        Debug.Print data(i, 1) & ": " & data(i, 2)
    Next i
End Sub

Tipps für Profis

  • Nutze die Option Explicit-Anweisung am Anfang Deiner Module, um sicherzustellen, dass Du alle Variablen deklarierst.
  • Experimentiere mit der QuickSort-Implementierung, um sie an Deine speziellen Anforderungen anzupassen, z.B. durch Hinzufügen von weiteren Sortierkriterien.
  • Halte den Code modular, indem Du häufig verwendete Funktionen in separate Module auslagerst.

FAQ: Häufige Fragen

1. Frage: Kann ich auch andere Sortiermethoden verwenden? Antwort: Ja, Du kannst alternative Sortieralgorithmen wie Bubble Sort oder Merge Sort implementieren, aber QuickSort ist in der Regel schneller und effizienter.

2. Frage: Wie kann ich die Sortierreihenfolge ändern? Antwort: Ändere den Parameter typSort beim Aufruf der Funktion in xlDescending, um die Sortierung absteigend durchzuführen.

3. Frage: Funktioniert das auch in Excel 2010? Antwort: Ja, die vorgestellte Methode funktioniert in Excel VBA ab Version 2007 und höher.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige