Anzeige
Archiv - Navigation
1460to1464
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Listbox bei Laufzeit sortieren?

Listbox bei Laufzeit sortieren?
08.12.2015 17:19:09
Dorgos
Guten Abend zusammen,
gibt es eine Möglichkeit eine Listbox oder mehrere per Laufzeit zu sortieren? (Habe dazu schon einige Funktionen im Web gefunden, allerdings immer mit einem Laufzeitfehler)
Meine Listboxen befinden sich nämlich in einer Userform, in der per "ADD"-Button ein Eintrag hinzugefügt wird, wenn das passiert soll in auch direkt diese Listbox sortieren.
Also wäre es mit einem Parameter für die Listbox nicht schlecht (da ich mehrere habe)
Den Code den ich aktuell benutze und nicht funktioniert ist folgender:
Public Function Liste_Sortieren(Liste As ListBox)
Dim i As Long
Dim x As Long
Dim TMP As String
Dim ARR() As String
Dim bAdd As Boolean
Dim nCount As Long
' alle Einträge in einen String speichern
For i = 0 To Liste.listCount - 1
TMP = TMP & Liste.List(i) & "¦¦"
Next i
If Len(TMP) > 0 Then TMP = Left$(TMP, Len(TMP) - 2)
' String splitten
ARR() = Split(TMP, "¦¦")
With Liste
' Liste löschen
.Clear
' macht das Ganze noch etwas schneller
.Visible = False
' alle Einträge des Arrays durchlaufen und
' sortiert in die ListBox schreiben
nCount = UBound(ARR)
For i = 0 To nCount
bAdd = True
For x = 0 To .listCount - 1
If .List(x) > ARR(i) Then
.AddItem ARR(i), x
bAdd = False: Exit For
End If
Next x
If bAdd Then .AddItem ARR(i)
Next i
' Listendarstellung wieder einschalten
.Visible = True
End With
End Function

Kann mir da wer weiterhelfen?
Gruß,
Dorgos

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Listbox bei Laufzeit sortieren?
08.12.2015 18:13:28
Nepumuk
Hallo,
die Sortierroutine:
Option Explicit

Private Enum SORT_VALUE
    Sort_Text
    Sort_Numeric
    Sort_Date
End Enum

Private Sub QuickSort(ByVal pvlngLBound As Long, ByVal pvlngUBound As Long, _
        ByVal pvlngColumn As Long, ByRef probjListBox As MSForms.ListBox, _
        ByVal pvenmlngSortValue As SORT_VALUE)

    
    Dim ialngIndex1 As Long, ialngIndex2 As Long, ialngIndex3 As Long
    Dim vntTemp As Variant, vntBuffer As Variant
    
    ialngIndex1 = pvlngLBound
    ialngIndex2 = pvlngUBound
    
    With probjListBox
        
        Do
            
            Select Case pvenmlngSortValue
                Case Sort_Text
                    vntTemp = .List((pvlngLBound + pvlngUBound) \ 2, pvlngColumn)
                    Do While .List(ialngIndex1, pvlngColumn) < vntTemp
                        ialngIndex1 = ialngIndex1 + 1
                    Loop
                    
                    Do While vntTemp < .List(ialngIndex2, pvlngColumn)
                        ialngIndex2 = ialngIndex2 - 1
                    Loop
                Case Sort_Numeric
                    vntTemp = CDbl(.List((pvlngLBound + pvlngUBound) \ 2, pvlngColumn))
                    Do While CDbl(.List(ialngIndex1, pvlngColumn)) < vntTemp
                        ialngIndex1 = ialngIndex1 + 1
                    Loop
                    
                    Do While vntTemp < CDbl(.List(ialngIndex2, pvlngColumn))
                        ialngIndex2 = ialngIndex2 - 1
                    Loop
                Case Sort_Date
                    vntTemp = CDate(.List((pvlngLBound + pvlngUBound) \ 2, pvlngColumn))
                    Do While CDate(.List(ialngIndex1, pvlngColumn)) < vntTemp
                        ialngIndex1 = ialngIndex1 + 1
                    Loop
                    
                    Do While vntTemp < CDate(.List(ialngIndex2, pvlngColumn))
                        ialngIndex2 = ialngIndex2 - 1
                    Loop
            End Select
            
            If ialngIndex1 <= ialngIndex2 Then
                
                For ialngIndex3 = 0 To .ColumnCount - 1
                    vntBuffer = .List(ialngIndex1, ialngIndex3)
                    .List(ialngIndex1, ialngIndex3) = .List(ialngIndex2, ialngIndex3)
                    .List(ialngIndex2, ialngIndex3) = vntBuffer
                Next
                
                ialngIndex1 = ialngIndex1 + 1
                ialngIndex2 = ialngIndex2 - 1
                
            End If
        Loop Until ialngIndex1 > ialngIndex2
    End With
    
    If pvlngLBound < ialngIndex2 Then Call QuickSort(pvlngLBound, _
        ialngIndex2, pvlngColumn, probjListBox, pvenmlngSortValue)
    If ialngIndex1 < pvlngUBound Then Call QuickSort(ialngIndex1, _
        pvlngUBound, pvlngColumn, probjListBox, pvenmlngSortValue)
    
End Sub

Aufrufen kannst du sie so:
Private Sub CommandButton1_Click()
    Call QuickSort(0, ListBox1.ListCount - 1, 2, ListBox1, Sort_Date)
End Sub

Die erste 0 bleibt fest, beim 2. Parameter musst du die Listbox anpassen genauso wie beim 4. Parameter. Der dritte Parameter gibt die Spalte an welche sortiert werden soll. Beachte, die erste Spalte hat die Nummer 0. Im 5. Parameter gibst du an um welche Art von Daten es sich handelt die sortiert werden.
Gruß
Nepumuk

Anzeige
AW: Listbox bei Laufzeit sortieren?
09.12.2015 10:12:31
Dorgos
Hallo Nepumuk,
vielen Dank für deine Top Lösung & Beschreibung!
Habe es gerade angewandet, klappt super!!
Musste nur den Sub & Enum auf Public stellen, weil meine Userform den sonst nicht gefunden hat.
Viele Grüße,
Dorgos

AW: Listbox bei Laufzeit sortieren?
09.12.2015 10:26:48
Dorgos
Ich hätte jetzt das gleiche Problem mit einer Combobox in der Userform, da soll im Prinzip genau das gleiche passieren.
Ich habe es mit dem Listbox Code versucht und dort überall "Listbox" durch "Combobox" ersetzt, klappt aber leider nicht.
Kann mir da vielleicht noch wer helfen?
Gruß,
Dorgos

AW: Listbox bei Laufzeit sortieren?
09.12.2015 10:41:31
Dorgos
Noch ein Problem.. Der Sortiercode für die Listbox ging beim ersten mal einwandfrei, jetzt allerdings bekomme ich folgende Fehlermeldung:
"Benutzerdefinierter Typ nicht definiert" und verweist auf:
Public Sub QuickSort(ByVal pvlngLBound As Long, ByVal pvlngUBound As Long, _
ByVal pvlngColumn As Long, ByRef probjListBox As MSForms.ListBox, _
ByVal pvenmlngSortValue As SORT_VALUE
Ich habe kurz gegoogelt und die Microsoft DAO 3.6 Object Library eingebunden, aber leider hat das auch nicht geholfen. Was ist nun falsch gelaufen?
Gruß,
Dorgos

Anzeige
AW: Listbox bei Laufzeit sortieren?
09.12.2015 10:51:38
Dorgos
Habe jetzt unter anderem auch die ADO-Library entfernt, hat leider auch nicht geholfen.

AW: Listbox bei Laufzeit sortieren?
09.12.2015 10:54:28
Nepumuk
Hallo,
kann ich so nicht nachvollziehen. Kannst du eine Mustermappe hochladen?
Gruß
Nepumuk

AW: Listbox bei Laufzeit sortieren?
09.12.2015 11:14:58
Dorgos
Hallo Nepumuk,
ich habe eben eine Beispielmappe angefertigt in der alles funktioniert hatte.
Dann habe ich nochmal in den meine Hauptmappe geschaut und gemerkt das ich den Code zuvor in einem einzelnen Modul drin hatte und dann in mein "General-Modul" kopiert habe.
Ich habe jetzt wieder ein neues Modul erstellt mit der SorterFunktion und das Enum und es klappt wieder!
Vielen Dank trotzdem für die rasche Antwort! :)
Kannst du mir noch bezüglich der Combobox helfen, wie ich diese sortiere?
Gruß,
Dorgos

Anzeige
AW: Listbox bei Laufzeit sortieren?
09.12.2015 11:20:09
Dorgos
Wenn ich jetzt im neuem Modul Listbox durch Combobox ersetze, erhalte ich folgenden Fehler:
"Typen unverträglich" und den Verweis auf:
If pvlngLBound 

AW: Listbox bei Laufzeit sortieren?
09.12.2015 11:26:08
Dorgos
Hallo Nepumuk,
der Daniel hat mir ne passende Lösung für die Combobox geschrieben, trotzdem vielen lieben Dank für deine Hilfe!
Gruß,
Dorgos

Combobox sortiere
09.12.2015 11:42:38
Rudi
Hallo,
ob List- oder Combobox ist letztlich wurscht.
Ändere die Parameter-Deklaration vom MSForms.Listbox in Object:
Private Sub QuickSort(ByVal pvlngLBound As Long, ByVal pvlngUBound As Long, _
ByVal pvlngColumn As Long, ByRef probjListBox As Object, _
ByVal pvenmlngSortValue As SORT_VALUE)
Gruß
Rudi

Anzeige
AW: Listbox bei Laufzeit sortieren?
09.12.2015 11:13:41
Daniel
Hi
wenns mit Quicksort nicht geht, dann kannst du doch auch die Liste in einen freien Bereich einer Exceltabelle einfügen, dort mit der Excelsortierfunktioin sortieren und dann wieder zurück in die Liste schreiben:
With Sheets("Tabelle1").Cells(1, 1).Resize(ListBox1.ListCount, ListBox1.ColumnCount)
.NumberFormat = "@"
.Value = ListBox1.List
.Sort key1:=.Cells(1, 1), order1:=xlAscending, Header:=xlNo
ListBox1.List = .Value
.ClearContents
End With
wenn du nur einen einzenen Wert in eine bereits sortierte Liste an der richtigen Stelle einfügen willst, dann musst du nicht sortieren, sondern du kannst auch einfach in einer Schleife durch die liste laufen und den Wert mit .AddItem Wert Indexnummer dort einfügen, wo der Wert grösser ist
hier mal der Code fürs einfügen des Wertes x in die Listbox an der passenden Position, ist der Wert schon vorhanden, wir er nicht eingefügt:
Dim x As String
Dim pos
x = "Dein neuer Wert"
For pos = 0 To ListBox1.ListCount - 1
If ListBox1.List(pos) = x Then
Exit For
ElseIf x 

sollte mit Combobox1.List genauso funktionieren.
Gruß Daniel

Anzeige
AW: Listbox bei Laufzeit sortieren?
09.12.2015 11:25:18
Dorgos
Hallo Daniel,
Das mit der Listbox habe ich jetzt ja zum Glück wieder hinbekommen, aber der zweite Code funktioniert super für beides!
Da meine Listboxen & Comboboxen in der Tat schon sortiert sind und nur der hinzugefügte Wert sortiert eingefügt werden soll, macht die For-Schleife genau das was sie soll!
Vielen Dank dafür!!
Gruß,
Dorgos

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige