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

Forumthread: VBA Array sortieren

VBA Array sortieren
26.05.2017 17:14:51
Herbert
Hallo,
wie kann ich das folgende Array nach der 2. Spalte sortieren?
Sub Abt_TB_Change()
Dim iArtCount%, iListboxRowNr%, arr() As Variant, iRow, iRowU, sSearch$
Application.ScreenUpdating = False
If Abt_TB = "" Then
LB_AbtArtikel.RowSource = "Artikel!A2:C" & iLastRow
Else
LB_AbtArtikel.RowSource = ""
With wksArtikel
iLastRow = IIf(IsEmpty(.Cells(Rows.Count, 2)), _
.Cells(Rows.Count, 2).End(xlUp).Row, Rows.Count)
'* hier wird nach dem Suchbegriff gesucht
Set ArtFound = .Range("B2:B" & iLastRow).Find(Abt_TB, _
.Cells(iLastRow, 2), , xlWhole, , xlNext)
If Not ArtFound Is Nothing Then
'* Schleife von gefundener Stelle bis zu letzten Zeile
sSearch = ArtFound
For iRow = 2 To iLastRow
If .Cells(iRow, 2)  "" And .Cells(iRow, 2) = ArtFound Then
ReDim Preserve arr(0 To 1, 0 To iRowU)
arr(0, iRowU) = .Cells(iRow, 1)
arr(1, iRowU) = .Cells(iRow, 3)
iRowU = iRowU + 1
End If
Next iRow
LB_AbtArtikel.Column = arr
End If
End With
End If
weiter:
Set ArtFound = Nothing
Application.ScreenUpdating = True
End Sub
Vielen Dank im Voraus!
Servus
Anzeige

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Array sortieren
26.05.2017 17:36:06
Matthias
Hallo! Wäre es ggf. nicht besser vor dem Einlesen die Zellen zu sortieren. Dann liest du sie schon sortiert ein und ersparst dir das array zu sortieren. VG
AW: VBA Array sortieren
26.05.2017 17:53:40
Nepumuk
Hallo Herbert,
so lautet der Aufruf:
Call QuickSort(LBound(arr, 2), UBound(arr, 2), arr)

und die Sortierroutine sieht so aus:
Private Sub QuickSort(ByVal pvlngLBound As Long, ByVal pvlngUBound As Long, ByRef pvavntArray() As Variant)
    
    Dim lngIndex1 As Long, lngIndex2 As Long, lngColumn As Long
    Dim vntBuffer As Variant, vntMemory As Variant
    
    lngIndex1 = pvlngLBound
    lngIndex2 = pvlngUBound
    
    vntMemory = pvavntArray(1, (lngIndex1 + lngIndex2) \ 2)
    
    Do
        
        Do While pvavntArray(1, lngIndex1) < vntMemory
            lngIndex1 = lngIndex1 + 1
        Loop
        
        Do While vntMemory < pvavntArray(1, lngIndex2)
            lngIndex2 = lngIndex2 - 1
        Loop
        
        If lngIndex1 <= lngIndex2 Then
            
            For lngColumn = LBound(pvavntArray, 1) To UBound(pvavntArray, 1)
                
                vntBuffer = pvavntArray(lngColumn, lngIndex1)
                pvavntArray(lngColumn, lngIndex1) = pvavntArray(lngColumn, lngIndex2)
                pvavntArray(lngColumn, lngIndex2) = vntBuffer
                
            Next
            
            lngIndex1 = lngIndex1 + 1
            lngIndex2 = lngIndex2 - 1
            
        End If
    Loop Until lngIndex1 > lngIndex2
    
    If pvlngLBound < lngIndex2 Then Call QuickSort(pvlngLBound, lngIndex2, pvavntArray)
    If lngIndex1 < pvlngUBound Then Call QuickSort(lngIndex1, pvlngUBound, pvavntArray)
    
End Sub

Gruß
Nepumuk
Anzeige
AW: VBA Array sortieren
26.05.2017 18:47:11
Herbert
Hallo Nepumuk,
vielen Dank für Deinen Code. Ich kann ihn allerdings erst morgen ausprobieren, denn jetzt ist "Relegation" meiner "Löwen"!
Ich gebe Dir morgen Bescheid.
Servus
AW: VBA Array sortieren
27.05.2017 10:38:29
Herbert
Hallo Nepumuk,
nochmals herzlichen Dank für Deine Sortierroutine, die natürlich wunderbar funktioniert.
Ich muss gestehen, dass ich es noch immer nicht verstanden habe. Aber ich werde mir noch einmal, was ich auch vor meiner Anfrage hier schon erfolglos getan habe, Deine Ausführungen zu diesem Thema auf Peters HP zu Gemüte führen, vielleicht kapiere ich es ja doch noch irgendwie, irgendwann!!! ;o)=)
Servus
Anzeige
Dazu...
29.05.2017 12:45:13
Michael
Herbert,
...was ein QuickSort ist und macht liest sich mE hier auch gut nach https://de.wikipedia.org/wiki/Quicksort (als Startpunkt)
Hat ja nicht nur was mit Excel bzw. Arrays zu tun...
LG
Michael
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige

Infobox / Tutorial

VBA Array sortieren: Schritt-für-Schritt-Anleitung


Schritt-für-Schritt-Anleitung

Um ein Array in VBA zu sortieren, kannst Du die QuickSort-Methode verwenden. Hier sind die Schritte, um dies zu erreichen:

  1. Array erstellen: Zuerst musst Du ein mehrdimensionales Array erstellen, das die zu sortierenden Daten enthält.

  2. QuickSort Subroutine: Füge die QuickSort Subroutine in Deinen VBA-Code ein. Hier ist ein Beispiel für eine solche Routine:

    Private Sub QuickSort(ByVal pvlngLBound As Long, ByVal pvlngUBound As Long, ByRef pvavntArray() As Variant)
       Dim lngIndex1 As Long, lngIndex2 As Long, lngColumn As Long
       Dim vntBuffer As Variant, vntMemory As Variant
    
       lngIndex1 = pvlngLBound
       lngIndex2 = pvlngUBound
       vntMemory = pvavntArray(1, (lngIndex1 + lngIndex2) \ 2)
    
       Do
           Do While pvavntArray(1, lngIndex1) < vntMemory
               lngIndex1 = lngIndex1 + 1
           Loop
           Do While vntMemory < pvavntArray(1, lngIndex2)
               lngIndex2 = lngIndex2 - 1
           Loop
           If lngIndex1 <= lngIndex2 Then
               For lngColumn = LBound(pvavntArray, 1) To UBound(pvavntArray, 1)
                   vntBuffer = pvavntArray(lngColumn, lngIndex1)
                   pvavntArray(lngColumn, lngIndex1) = pvavntArray(lngColumn, lngIndex2)
                   pvavntArray(lngColumn, lngIndex2) = vntBuffer
               Next
               lngIndex1 = lngIndex1 + 1
               lngIndex2 = lngIndex2 - 1
           End If
       Loop Until lngIndex1 > lngIndex2
    
       If pvlngLBound < lngIndex2 Then Call QuickSort(pvlngLBound, lngIndex2, pvavntArray)
       If lngIndex1 < pvlngUBound Then Call QuickSort(lngIndex1, pvlngUBound, pvavntArray)
    End Sub
  3. Aufruf der Sortierfunktion: Rufe die QuickSort-Funktion auf, nachdem Du das Array gefüllt hast:

    Call QuickSort(LBound(arr, 2), UBound(arr, 2), arr)

Häufige Fehler und Lösungen

  • Fehler 1: "Index außerhalb des Bereichs"

    • Lösung: Stelle sicher, dass die Indizes korrekt definiert sind. Überprüfe die Grenzen mit LBound und UBound.
  • Fehler 2: "Typen unverträglich"

    • Lösung: Achte darauf, dass das Array den Typ Variant hat, wenn Du mit gemischten Datentypen arbeitest.

Alternative Methoden

Eine Alternative zur Sortierung eines Arrays in VBA ist die Verwendung von Excel-Funktionen. Du kannst die Daten in ein Worksheet schreiben, die Sort-Methode von Excel verwenden und die sortierten Daten dann zurück in ein Array laden:

Worksheets("Sheet1").Range("A1:B10").Sort Key1:=Worksheets("Sheet1").Range("B1"), Order1:=xlAscending

Praktische Beispiele

Hier ist ein Beispiel, wie Du ein Excel-Array sortieren kannst. Angenommen, Du hast ein Array von Artikeln mit Preisen:

Dim arr(1 To 5, 1 To 2) As Variant
arr(1, 1) = "Artikel A": arr(1, 2) = 10
arr(2, 1) = "Artikel B": arr(2, 2) = 5
arr(3, 1) = "Artikel C": arr(3, 2) = 20
arr(4, 1) = "Artikel D": arr(4, 2) = 15
arr(5, 1) = "Artikel E": arr(5, 2) = 8

Call QuickSort(LBound(arr, 2), UBound(arr, 2), arr)

Dieses Beispiel zeigt, wie Du ein Array von Artikeln nach dem Preis sortieren kannst.


Tipps für Profis

  • Verwende Application.ScreenUpdating = False, um die Bildschirmaktualisierung während der Sortierung zu deaktivieren. Dies verbessert die Leistung.

  • Nutze die Sort-Methode von Excel, wenn Du mit großen Datenmengen arbeitest, da sie optimiert ist.

  • Experimentiere mit Sortieralgorithmen: Neben QuickSort kannst Du auch andere Algorithmen wie MergeSort oder BubbleSort implementieren, um Deine Programmierkenntnisse zu vertiefen.


FAQ: Häufige Fragen

1. Wie kann ich ein mehrdimensionales Array sortieren?
Du kannst die gleiche QuickSort-Methode verwenden, indem Du die Indizes entsprechend anpasst.

2. Was ist der Unterschied zwischen einem Array und einer Collection in VBA?
Ein Array hat eine feste Größe, während eine Collection dynamisch ist und sich bei Bedarf erweitern kann.

3. Wie kann ich meine Sortierfunktion optimieren?
Teste verschiedene Sortieralgorithmen und vergleiche die Ausführungszeiten, um die beste Leistung für Deine spezifischen Daten zu finden.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige