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

Forumthread: ListBox sortieren

ListBox sortieren
23.08.2017 14:57:43
Siegfried
Hallo zusammen,
ich möchte die Einträge in einer ListBox sortieren und habe in der Hilfe folgenden Code gefunden:
Dim iLast As Integer, iNext As Integer
Dim iTmp
With Frm_Anm.Lst_Mit
For iLast = 0 To .ListCount - 1
For iNext = iLast + 1 To .ListCount - 1
If .List(iLast) größer .List(iNext) Then
iTmp = .List(iLast, 0)
Debug.Print iTmp
.List(iLast) = .List(iNext)
.List(iNext) = iTmp1
End If
Next iNext
Next iLast
End With
Der Code funktioniert auch mit dem Eintrag in der ersten Spalte.
Wie muss ich den Code ändern, damit auch die Einträge der zweiten Spalte sortiert werden?
Gruß
Siegfried
Anzeige

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: ListBox sortieren
23.08.2017 16:29:23
ChrisL
Hi Siegfried
Such mal nach:
mehrdimensionales array sort site:www.herber.de
Falls du die Daten nicht bereits vor dem Einlesen in die ListBox sortieren willst, gibt es fix fertige Sortierfunktionen. Bei mehrspaltigen Array/Datenfelder sieht die Sortierfunktion doch etwas komplizierter aus, so etwas möchte ich nicht neu programmieren ;)
Die List-Eigenschaft (ListBox1.List) ist übrigens bereits ein Array/Datenfeld. Nicht ganz sicher bin ich ob du das Array/Datenfeld noch drehen/transponieren musst (horizontal/vertikal)...
Application.Transpose(ListBox1.List)
cu
Chris
Anzeige
AW: ListBox sortieren
23.08.2017 16:44:18
Siegfried
Hi Chris,
Danke für den Hinweis.
Da werde ich mich mal umsehen.
bisher habe ich die Daten vor dem Einlesen sortiert.
Jetzt wollte ich diesen Umweg vermeiden.
Gruß
Siegfried
AW: ListBox sortieren
23.08.2017 17:22:25
mmat
Hi Siegfried,
oder wie wärs damit:
der folgende Code braucht ein Form mit einer Listbox (2 spaltig) und 2 Commandbuttons. Bei der Initialisierung wird aus Spalte A und B des aktuellen Blattes gelesen und dabei gleich nach Spalte A sortiert. Mit den Knöpfen wird nach beliben nach Spalte 1 oder 2 sortiert.
@Alle: Wenn jemand eine elegantere Methode kennt, eine Listboxzeile zu verschieben, bitte melden !
Private Sub CommandButton1_Click()
sort 0
End Sub
Private Sub CommandButton2_Click()
sort 1
End Sub
Private Sub UserForm_Initialize()
Dim s As String, r As Long, p As Long
r = 1: s = Cells(r, 1)
While (s  "")
p = 0
Do
If ListBox1.List(p, 0)  ListBox1.ListCount - 1
ListBox1.AddItem s, p
ListBox1.List(p, 1) = Cells(r, 2)
r = r + 1: s = Cells(r, 1)
Wend
End Sub
Private Sub sort(col As Long)
Dim n As Long, p As Long, a() As String, i As Long
ListBox1.AddItem " ", 0
ListBox1.List(0, 1) = "0"
ReDim a(ListBox1.ColumnCount - 1)
For n = 2 To ListBox1.ListCount - 1
p = n
While ListBox1.List(n, col) 

Anzeige
AW: ListBox sortieren
23.08.2017 18:06:25
Matthias
Moin mmat! Ein Hinweis noch zu deinem Code. Beim Vergleich sollte man noch prüfen (war ja aber nicht angegeben) ob es "reine" Zahlen sind oder nicht. Der Wert wird aus der LIste als string genommen. Wenn dort aber Zahlen sind, wird aus der Liste 1,2,10 bei der Sortierung 1,10,2.
Zur allgemeinen Frage:
Schneller würde ggf. gehen, wenn man die ganze Liste in ein Blatt kopiert und dort sortiert (Excelintern) und zurückliest.
Alternative dazu wäre, die Liste an ein Array übergeben und dann nur im Array vergleich und ggf. in ein temporäres Array schreiben. Am Ende dann das temp. Array als Liste an die Listbox geben. Das sollte (ungetestet) ggf. schneller sein, als immer auf das Listboxelement zuzugreifen und dort Einträge zu schreiben und zu löschen. Macht man idR ja beim Zugriff auf ein Tabellenblatt auch nicht, weil es Zeit kostet. ISt nur eine Theorie, weiß nicht, ob man das bei normalen Listen überhaupt zeitlich merkt.
VG
Anzeige
AW: ListBox sortieren
24.08.2017 09:02:19
mmat
Hallo Matthias,
richtig, bei größeren Datenmengen (so ab 10000 Zeilen schätze ich mal) wird das Verfahren wahrscheinlich ineffizient, so dass man sich eine andere Strategie überlegen muß.
Und natürlich ist das Verfahren String. Ich sollte vielleicht der Vollständigkeit halber erwähnen, das in diesem Programmteil Werte in die Tabelle geschrieben werden, die kleiner sein müssen wie jeder in der jeweiligen Spalte vorkommende Wert.
ListBox1.AddItem " ", 0
ListBox1.List(0, 1) = "0"
Ich hab für den Siegfried aber ganz bewusst ein simples in-place Verfahren gewählt. Diese hat eben nur den einen Schönheitsfehler (in meinen Augen ...), dass mir das Verschieben einer Zeile recht unelegant erscheint.
Danke fürs Feedback.
vg, MM
Anzeige
AW: ListBox sortieren
24.08.2017 09:15:17
Daniel
Hi
wenn die Listbox mehrere Spalten hat, dann musst du die Tauschaktion:
iTmp = .List(iLast, 0)
.List(iLast) = .List(iNext)
.List(iNext) = iTmp1
nicht nur für die erste Spalte durchführen, sondern in gleicher Weise für alle Spalten, am besten in einer Schleife:
For iSpalte = 0 to .ColumnCount - 1
iTmp = .List(iLast, iSpalte)
.List(iLast, iSpalte) = .List(iNext, iSpalte)
.List(iNext, iSpalte) = iTmp
Next

Gruß Daniel
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

ListBox in Excel sortieren


Schritt-für-Schritt-Anleitung

Um eine ListBox in Excel mit VBA zu sortieren, kannst du den folgenden Code verwenden. Dieser sortiert die Einträge in einer ListBox, die mehrere Spalten hat.

  1. Öffne den VBA-Editor (Alt + F11).
  2. Füge ein UserForm mit einer ListBox und zwei CommandButtons hinzu.
  3. Verwende den folgenden Code im UserForm:
Private Sub CommandButton1_Click()
    sort 0 ' Sortiert nach der ersten Spalte
End Sub

Private Sub CommandButton2_Click()
    sort 1 ' Sortiert nach der zweiten Spalte
End Sub

Private Sub UserForm_Initialize()
    Dim s As String
    Dim r As Long
    Dim p As Long
    r = 1
    s = Cells(r, 1)
    While (s <> "")
        p = 0
        Do
            If ListBox1.List(p, 0) = "" Then
                ListBox1.AddItem s, p
                ListBox1.List(p, 1) = Cells(r, 2)
                r = r + 1
                s = Cells(r, 1)
            End If
        Loop While ListBox1.List(p, 0) <> ""
    Wend
End Sub

Private Sub sort(col As Long)
    Dim n As Long, p As Long
    Dim a() As String
    ListBox1.AddItem " ", 0
    ListBox1.List(0, 1) = "0"
    ReDim a(ListBox1.ColumnCount - 1)
    For n = 2 To ListBox1.ListCount - 1
        p = n
        While ListBox1.List(n, col) < ListBox1.List(p, col)
            ' Swap entries for all columns
            For iSpalte = 0 To ListBox1.ColumnCount - 1
                Dim iTmp As String
                iTmp = ListBox1.List(n, iSpalte)
                ListBox1.List(n, iSpalte) = ListBox1.List(p, iSpalte)
                ListBox1.List(p, iSpalte) = iTmp
            Next
            n = p
            p = n - 1
        Wend
    Next
End Sub

Häufige Fehler und Lösungen

  • Fehler: "Typ Mismatch"

    • Lösung: Stelle sicher, dass die Daten, die du sortierst, im richtigen Format vorliegen. Bei Zahlen sollten sie als Zahlen und nicht als Strings gespeichert sein.
  • Fehler: ListBox bleibt leer

    • Lösung: Überprüfe, ob die Daten tatsächlich aus dem Excel-Blatt geladen werden. Achte darauf, dass der richtige Bereich im Code angegeben ist.

Alternative Methoden

Eine alternative Methode zur Sortierung einer ListBox ist, die Daten zuerst in ein Array zu kopieren, dieses Array zu sortieren und dann die sortierten Daten zurück in die ListBox zu übertragen. Dies kann effizienter sein, besonders bei großen Datenmengen.

Dim dataArray() As Variant
dataArray = Application.Transpose(ListBox1.List) ' Kopiere ListBox in ein Array
' Hier kannst du das Array sortieren
' ...
' Nach dem Sortieren zurück in die ListBox

Praktische Beispiele

Hier ist ein einfaches Beispiel zur Verwendung des Codes. Angenommen, du hast eine Excel-Datei mit zwei Spalten: „Name“ und „Alter“. Der Code oben kann verwendet werden, um die ListBox nach „Name“ oder „Alter“ zu sortieren.


Tipps für Profis

  • Verwendung von Arrays: Wenn du mit großen Datenmengen arbeitest, ist es oft schneller, die ListBox-Daten in ein Array zu kopieren, das Array zu sortieren und dann die sortierten Daten zurück in die ListBox zu übertragen.
  • Sortieralgorithmen: Experimentiere mit verschiedenen Sortieralgorithmen (z. B. QuickSort oder MergeSort), um die Leistung zu optimieren.

FAQ: Häufige Fragen

1. Wie kann ich eine ListBox sortieren, die mehr als zwei Spalten hat?
Verwende eine Schleife, um die Sortieraktion für jede Spalte durchzuführen, wie im obigen Beispiel gezeigt.

2. Gibt es eine eingebaute Funktion zum Sortieren einer ListBox?
Excel bietet keine direkte eingebaute Funktion zum Sortieren einer ListBox. Du musst eine Sortierlogik implementieren, wie im Tutorial beschrieben.

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