Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema CommandButton
BildScreenshot zu CommandButton CommandButton-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema Userform
BildScreenshot zu Userform Userform-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema ListBox
BildScreenshot zu ListBox ListBox-Seite mit Beispielarbeitsmappe aufrufen

Listbox bei Laufzeit sortieren?

Betrifft: Listbox bei Laufzeit sortieren? von: Dorgos
Geschrieben am: 08.12.2015 17:19:09

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

  

Betrifft: AW: Listbox bei Laufzeit sortieren? von: Nepumuk
Geschrieben am: 08.12.2015 18:13:28

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


  

Betrifft: AW: Listbox bei Laufzeit sortieren? von: Dorgos
Geschrieben am: 09.12.2015 10:12:31

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


  

Betrifft: AW: Listbox bei Laufzeit sortieren? von: Dorgos
Geschrieben am: 09.12.2015 10:26:48

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


  

Betrifft: AW: Listbox bei Laufzeit sortieren? von: Dorgos
Geschrieben am: 09.12.2015 10:41:31

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


  

Betrifft: AW: Listbox bei Laufzeit sortieren? von: Dorgos
Geschrieben am: 09.12.2015 10:51:38

Habe jetzt unter anderem auch die ADO-Library entfernt, hat leider auch nicht geholfen.


  

Betrifft: AW: Listbox bei Laufzeit sortieren? von: Nepumuk
Geschrieben am: 09.12.2015 10:54:28

Hallo,

kann ich so nicht nachvollziehen. Kannst du eine Mustermappe hochladen?

Gruß
Nepumuk


  

Betrifft: AW: Listbox bei Laufzeit sortieren? von: Dorgos
Geschrieben am: 09.12.2015 11:14:58

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


  

Betrifft: AW: Listbox bei Laufzeit sortieren? von: Dorgos
Geschrieben am: 09.12.2015 11:20:09

Wenn ich jetzt im neuem Modul Listbox durch Combobox ersetze, erhalte ich folgenden Fehler:

"Typen unverträglich" und den Verweis auf:

If pvlngLBound < ialngIndex2 Then Call QuickSort(pvlngLBound, _
        ialngIndex2, pvlngColumn, probjcomboBox, pvenmlngSortValue)



  

Betrifft: AW: Listbox bei Laufzeit sortieren? von: Dorgos
Geschrieben am: 09.12.2015 11:26:08

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


  

Betrifft: Combobox sortiere von: Rudi Maintaire
Geschrieben am: 09.12.2015 11:42:38

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


  

Betrifft: AW: Listbox bei Laufzeit sortieren? von: Daniel
Geschrieben am: 09.12.2015 11:13:41

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 < ListBox1.List(pos) Then
        ListBox1.AddItem x, pos
        Exit For
    End If
Next
If pos = ListBox1.ListCount Then ListBox1.AddItem x

sollte mit Combobox1.List genauso funktionieren.


Gruß Daniel


  

Betrifft: AW: Listbox bei Laufzeit sortieren? von: Dorgos
Geschrieben am: 09.12.2015 11:25:18

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


 

Beiträge aus den Excel-Beispielen zum Thema "Listbox bei Laufzeit sortieren?"