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

Forumthread: Listbox Sortierung umkehren

Listbox Sortierung umkehren
06.01.2020 00:53:56
Curly
Schönen guten Abend,
ich bin hier im Archiv auf einen tollen Code gestoßen, welcher mir eine Listbox sortiert.
Das funktioniert auch alles wunderbar, jedoch wäre es klasse, wenn mir jemand helfen könnte, ein weiteres Argument mit einzubauen. Ich würde gerne noch als Parameter mit übergeben, ob aufsteigend oder absteigend sortiert wird.
https://www.herber.de/forum/archiv/648to652/651080_Listbox_sortieren.html
der Code:
Sub SortBox(cltBox As Control, intSpalten As Integer, _
intSpalte As Integer, Optional bytWie As Byte = 1)
' So DIS 28.04.05
' SortBox sortiert nicht gebundene List- und Comboboxen. Gebundene List- und Comboboxen
' (Angabe bei RowSource oder ListFillRange) können nicht sortiert werden.
' cltBox     : Name der Listbox die sortiert werden soll.
' intSpalten : Wieviele Spalten sollen mit sortiert werden. Sollte der Anzahl der Spalten
'              in der Listbox entsprechen
' intSpalte  : Nach welcher Spalte soll sortiert werden.
' bytWie     : 1 oder Nicht angegeben als Text
'            : 2 als Zahl, dann muß die ganze Spalte Zahlen enthalten.
'            : 3 als Datum, dann muß die ganze Spalte Datumwerte enthalten.
' Aufruf zum Beispiel so: ListBox1 mit 7 Spalten, Sortierung nach Spalte 1 Sortierordnung Text
' SortBox ListBox1, 7, 1  oder SortBox ListBox1, 7, 1, 1
' Oder so    : Listbox17 mit 2 Spalten, Sortierung nach Spalte 2 Sortierordnung Zahlen
' SortBox ListBox17, 2, 2, 2
Dim intLast As Integer, intNext As Integer, intCounter As Integer, intFehler As Integer
Dim strTmp As String, strFehlertext As String
Dim variLast As Variant, variNext As Variant
On Error GoTo Errorhandler
intFehler = 0
With cltBox
For intLast = 0 To .ListCount - 1
For intNext = intLast + 1 To .ListCount - 1
Select Case bytWie
Case 1
intFehler = 0
variLast = CStr(.List(intLast, intSpalte - 1))
variNext = CStr(.List(intNext, intSpalte - 1))
Case 2
intFehler = 1
variLast = CDbl(.List(intLast, intSpalte - 1))
variNext = CDbl(.List(intNext, intSpalte - 1))
Case 3
intFehler = 2
variLast = CDate(.List(intLast, intSpalte - 1))
variNext = CDate(.List(intNext, intSpalte - 1))
End Select
intFehler = 0
If variLast > variNext Then
For intCounter = 0 To intSpalten - 1
strTmp = CStr(.List(intLast, intCounter))
.List(intLast, intCounter) = CStr(.List(intNext, intCounter))
.List(intNext, intCounter) = strTmp
Next intCounter
End If
Next intNext
Next intLast
End With
Exit Sub
Errorhandler:
Select Case intFehler
Case 0
strFehlertext = "In der Listbox Sortierung ist ein Fehler aufgetreten !"
Case 1
strFehlertext = "Nicht alle Werte in der zu sortierenden Spalte sind Zahlen !"
Case 2
strFehlertext = "Nicht alle Werte in der zu sortierenden Spalte sind Datumswerte !"
Case Else
strFehlertext = "Unerwarteter Fehler !"
End Select
MsgBox strFehlertext & " Bitte informieren Sie 'So' ! " & vbCr & vbCr & _
"Fehler aufgetreten in " & cltBox.Name & " !" & vbCr & _
"Fehlernummer = " & Err.Number & vbCr & _
"Fehlerbeschreibung = " & Err.Description & vbCr & _
"Fehlersource = " & Err.Source, vbCritical, " Meldung vom Makro SortBox !"
End Sub
Vielen Dank
Curly
Anzeige

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Listbox Sortierung umkehren
06.01.2020 08:10:48
Torsten
Hallo Curly,
ich denke, du brauchst dann 2 Makros.
Oder ein weiteres Select Case ueber einen Optionbutton oder so.
Um absteigend zu sortieren, muss du diese Zeile aendern:

For intLast = 0 To .ListCount - 1

in

For intLast = .ListCount - 1 to 0 Step - 1

Gruss Torsten
Anzeige
AW: Listbox Sortierung umkehren
06.01.2020 10:08:15
Curly
Hallo Thorsten,
dein Lösungsvorschlag bringt leider das gleiche Ergebnis, jedoch muss man öfters klicken bis er die Liste komplett sortiert hat.
Ein weiterer Punkt , welcher mit aufgefallen ist bei "sortieren" nach Text, wird anscheint nur der erste Buchstabe beachtet, d.h. das z.b "Dorint" vor "Dabi" kommt.
Gruß & vielen Dank
Curly
Anzeige
AW: Listbox Sortierung umkehren
06.01.2020 10:13:23
Curly
"Ein weiterer Punkt , welcher mit aufgefallen ist bei "sortieren" nach Text, wird anscheint nur der erste Buchstabe beachtet, d.h. das z.b "Dorint" vor "Dabi" kommt."
Hat sich erleidgt, dieser "Fehler" kam, weil der er groß und Kleinschreibung beachtet.
Und ich Dorint komplett groß geschrieben hatte ...
Anzeige
AW: Listbox Sortierung umkehren
06.01.2020 14:38:09
Nepumuk
Hallo Curly,
ich hab dir mal was programmiert:
https://www.herber.de/bbs/user/134203.xlsm
Deine Fehlerbehandlung musst du selber einbauen.
Gruß
Nepumuk
AW: Listbox Sortierung umkehren
06.01.2020 21:26:42
Curly
Hallo Nepumuk,
vielen dank , eingebaut, getestet , läuft. Danke Danke Dank
Ich hätte noch eine Frage, ich möchte eine Spalte mit Datum's sortieren, allerdings sind hier leere Zellen dabei, kann man das irgendwie noch einstellen, dass das auch funktioniert?
Danke schönen Abend.
Gruß Curly
Anzeige
AW: Listbox Sortierung umkehren
07.01.2020 07:56:04
Nepumuk
Hallo Curly,
was passt da nicht?
Gruß
Nepumuk
AW: Listbox Sortierung umkehren
07.01.2020 16:27:16
Curly
Hi,
wenn bei den Datum's eine Leere Zeile ist kommt ein Laufzeitfehler 13 und er markiert die Zeile vntBuffer = CDate(pravntArray((pvlngLbound + pvlngUbound) \ 2, pvlngSortColumn))
In deinem Beispiel funktioniert es tadellos.
Die Datum's bzw Leere Zeilen kommen allerdings über eine Matrix-formel auf das Tabellenblatt.
Allerdings auch wenn ich es kopiere und als Werte wieder einfüge bleibt der Fehler weiterhin bestehen.
Anzeige
AW: Listbox Sortierung umkehren
07.01.2020 16:36:41
Nepumuk
Hallo Curly,
dann muss du den Fehler abfangen.
Teste mal:
If Not IsDate(pravntArray((pvlngLbound + pvlngUbound) \ 2, pvlngSortColumn)) Then _
    pravntArray((pvlngLbound + pvlngUbound) \ 2, pvlngSortColumn) = Empty

vntBuffer = CDate(pravntArray((pvlngLbound + pvlngUbound) \ 2, pvlngSortColumn))

Wobei ich dazu tendieren würde das direkt nach dem füllen der ListBox zu machen.
Gruß
Nepumuk
Anzeige
AW: Listbox Sortierung umkehren
07.01.2020 16:43:32
Curly
Wie kann man das richtig machen, nach dem befüllen, da jetzt der nächste Laufzeitfehler bei

Do While CDate(pravntArray(lngIndex1, pvlngSortColumn)) 
kommt
AW: Listbox Sortierung umkehren
07.01.2020 16:53:01
Nepumuk
Hallo Curly,
würde ich so machen:
Private Sub UserForm_Initialize()
    Dim lngIndex As Long
    With Tabelle1
        ListBox1.List = .Range(.Cells(2, 1), .Cells(.Rows.Count, 3).End(xlUp)).Value
    End With
    With ListBox1
        For lngIndex = 0 To .ListCount - 1
            If Not IsDate(.List(lngIndex, 1)) Then .List(lngIndex, 1) = Empty
        Next
    End With
End Sub

Gruß
Nepumuk
Anzeige
AW: Listbox Sortierung umkehren
07.01.2020 17:05:34
Nepumuk
Hallo Curly,
das klappt nicht. Ich muss weiter testen.
Ok, so geht's:
Private Sub UserForm_Initialize()
    Dim avntValues As Variant
    Dim ialngIndex As Long
    With Tabelle1
        avntValues = .Range(.Cells(2, 1), .Cells(.Rows.Count, 3).End(xlUp)).Value
    End With
    For ialngIndex = LBound(avntValues) To UBound(avntValues)
        If Not IsDate(avntValues(ialngIndex, 2)) Then avntValues(ialngIndex, 2) = Empty
    Next
    ListBox1.List = avntValues
End Sub

Gruß
Nepumuk
Anzeige
AW: Listbox Sortierung umkehren
07.01.2020 17:42:49
Curly
Danke Nepumuk,
Werde ich morgen Früh gleich testen und mich wieder melden, ansonsten suche ich mir eine Möglichkeit um es ohne die Array Formel angezeigt zu bekommen.
Denke eh fast das ist die bessere / schneller und saubere Lösung.
Bis morgen , schönen Abend
Curly
AW: Listbox Sortierung umkehren
08.01.2020 07:37:37
Curly
Guten Morgen Nepumuk,
mit deinem neuen Code , funktioniert auch meine Matrix Spalte.
jetzt läuft alles so , wie ich es mir gewünscht habe.
Vielen Vielen Dank für deine Ausdauer/Geduld und Unterstützung.
Curly
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Listbox Sortierung in Excel umkehren


Schritt-für-Schritt-Anleitung

  1. Öffne den VBA-Editor in Excel, indem du ALT + F11 drückst.

  2. Füge ein neues Modul hinzu: Rechtsklick auf "VBAProject (DeineDatei.xlsx)" > Einfügen > Modul.

  3. Kopiere den folgenden Code in das Modul:

    Sub SortBox(cltBox As Control, intSpalten As Integer, _
    intSpalte As Integer, Optional bytWie As Byte = 1)
    Dim intLast As Integer, intNext As Integer
    Dim strTmp As String
    On Error GoTo Errorhandler
    With cltBox
       For intLast = 0 To .ListCount - 1
           For intNext = intLast + 1 To .ListCount - 1
               If CStr(.List(intLast, intSpalte - 1)) > CStr(.List(intNext, intSpalte - 1)) Then
                   For intCounter = 0 To intSpalten - 1
                       strTmp = CStr(.List(intLast, intCounter))
                       .List(intLast, intCounter) = CStr(.List(intNext, intCounter))
                       .List(intNext, intCounter) = strTmp
                   Next intCounter
               End If
           Next intNext
       Next intLast
    End With
    Exit Sub
    Errorhandler:
    MsgBox "Ein Fehler ist aufgetreten!"
    End Sub
  4. Modifiziere den Code für absteigende Sortierung, indem du die Schleife änderst:

    For intLast = .ListCount - 1 To 0 Step -1
  5. Rufe die Funktion auf, um die Listbox zu sortieren. Zum Beispiel:

    SortBox ListBox1, 7, 1

Häufige Fehler und Lösungen

  • Fehler 13: Typen unverträglich: Dieser Fehler tritt häufig auf, wenn die Liste leere Zellen enthält oder nicht alle Werte im richtigen Format vorliegen.

    • Lösung: Füge eine Fehlerbehandlung hinzu, um leere Zellen zu ignorieren:
    If Not IsDate(.List(lngIndex, 1)) Then .List(lngIndex, 1) = Empty
  • Sortierung nach Text funktioniert nicht richtig: Wenn nur der erste Buchstabe berücksichtigt wird, könnte dies an der Groß- und Kleinschreibung liegen.

    • Lösung: Stelle sicher, dass alle Texte in der gleichen Schreibweise vorliegen, bevor du die Sortierung anwendest.

Alternative Methoden

Du kannst auch Option-Buttons verwenden, um zwischen aufsteigender und absteigender Sortierung zu wechseln. In diesem Fall kannst du die SortBox-Methode entsprechend anpassen, um den gewünschten Parameter für die Sortierreihenfolge zu übergeben.


Praktische Beispiele

Hier ist ein Beispiel, wie du eine Excel-Liste umkehren kannst:

  1. Angenommen, du hast eine Listbox mit den Werten A, B, C, D.
  2. Nutze die SortBox-Funktion, um diese Werte in umgekehrter Reihenfolge anzuzeigen.
  3. Rufe die Funktion so auf:

    SortBox ListBox1, 1, 1, 2 ' 2 für absteigende Sortierung

Tipps für Profis

  • Verwende Arrays: Für größere Datensätze kann es sinnvoll sein, die Daten zuerst in ein Array zu laden und dann die Sortierung durchzuführen. Dies kann die Leistung verbessern.
  • Ereignisse optimieren: Setze Application.EnableEvents = False vor der Sortierung und wieder auf True, um unnötige Berechnungen während der Sortierung zu vermeiden.
  • Fehlerbehandlung: Implementiere umfassende Fehlerbehandlungsroutinen, um mögliche Laufzeitfehler elegant abzufangen.

FAQ: Häufige Fragen

1. Wie kann ich die Auswahl in einer Listbox umkehren?
Um die Auswahl in einer Listbox umzukehren, kannst du eine Schleife verwenden, die die Indizes der Listenelemente in umgekehrter Reihenfolge durchläuft.

2. Funktioniert dieser Code in allen Excel-Versionen?
Ja, der gezeigte VBA-Code sollte in den meisten Excel-Versionen funktionieren, die VBA unterstützen, einschließlich Excel 2010 und neuer.

3. Was tun, wenn ich leere Zellen in der Liste habe?
Füge eine Überprüfung auf leere Zellen in deinem Code hinzu, um Laufzeitfehler zu vermeiden. Nutze die IsEmpty-Funktion, um leere Einträge zu ignorieren.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige