Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1104to1108
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Listbox sortieren

Listbox sortieren
kirsche
hallo leute,
wieder mal benötige ich eure hilfe.
ich habe eine listbox2 mit 7 spalten. spalte 2 - 7 erhällt die werte aus listbox1 nach besonderer auswahl. spalte 0 und 1 werden separat über eine textbox gefüllt. in spalte 0 stehen nur zahlen und in spalte 1 nur text. nun möchte ich die listbox2 sortieren.
bei meiner recherche bin ich auf folgenden code gestoßen, welcher auch super funktioniert. leider wird die sortierung immer nur auf eine spalte bezogen. wie bekomme ich es hin, erst nach spalte 1 zu sortieren und dann nach spalte 0?
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

SortBox ListBox2, 7, 2, 1 habe ich für die erste sortierung angewandt
SortBox ListBox2, 7, 1, 2 sortiert erneut und meine erste sortierung ist dahin
kann mir jemand helfen?
gruß kirsche

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

Betreff
Benutzer
Anzeige
AW: Listbox sortieren
22.09.2009 17:30:28
Tino
Hallo,
versuche es mal mit prcQuickSort Code von Max Kaffl 2005
kommt als Code in Modul
'   Code Max Kaffl 2005 
 
 
Sub prcQuickSort(lngLbound As Long, lngUbound As Long, _
    intSortColumn As Integer, bntSortKey As Boolean, vntArray() As Variant) 
    Dim intIndex As Integer 
    Dim lngIndex1 As Long, lngIndex2 As Long 
    Dim vntTemp As Variant, vntBuffer As Variant 
    lngIndex1 = lngLbound 
    lngIndex2 = lngUbound 
    vntBuffer = vntArray((lngLbound + lngUbound) \ 2, intSortColumn) 
    Do 
        If bntSortKey Then 
            Do While vntArray(lngIndex1, intSortColumn) < vntBuffer 
                lngIndex1 = lngIndex1 + 1 
            Loop 
            Do While vntBuffer < vntArray(lngIndex2, intSortColumn) 
                lngIndex2 = lngIndex2 - 1 
            Loop 
        Else 
            Do While vntArray(lngIndex1, intSortColumn) > vntBuffer 
                lngIndex1 = lngIndex1 + 1 
            Loop 
            Do While vntBuffer > vntArray(lngIndex2, intSortColumn) 
                lngIndex2 = lngIndex2 - 1 
            Loop 
        End If 
        If lngIndex1 < lngIndex2 Then 
            If vntArray(lngIndex1, intSortColumn) <> _
                vntArray(lngIndex2, intSortColumn) Then 
                For intIndex = Lbound(vntArray, 2) To Ubound(vntArray, 2) 
                    vntTemp = vntArray(lngIndex1, intIndex) 
                    vntArray(lngIndex1, intIndex) = _
                        vntArray(lngIndex2, intIndex) 
                    vntArray(lngIndex2, intIndex) = vntTemp 
                Next 
            End If 
            lngIndex1 = lngIndex1 + 1 
            lngIndex2 = lngIndex2 - 1 
        ElseIf lngIndex1 = lngIndex2 Then 
            lngIndex1 = lngIndex1 + 1 
            lngIndex2 = lngIndex2 - 1 
        End If 
    Loop Until lngIndex1 > lngIndex2 
    If lngLbound < lngIndex2 Then Call prcQuickSort(lngLbound, _
        lngIndex2, intSortColumn, bntSortKey, vntArray()) 
    If lngIndex1 < lngUbound Then Call prcQuickSort(lngIndex1, _
        lngUbound, intSortColumn, bntSortKey, vntArray()) 
End Sub 
 
 


In der Userform dann so.

Private Sub CommandButton1_Click()
Dim meAr()
meAr = ListBox1.List
    Call prcQuickSort(Lbound(meAr), Ubound(meAr), 0, True, meAr)
    Call prcQuickSort(Lbound(meAr), Ubound(meAr), 6, True, meAr)
ListBox2.List = meAr
End Sub
Gruß Tino
Anzeige
AW: Listbox sortieren
22.09.2009 17:32:13
Tino
Hallo,
ListBox2.List = meAr sollte natürlich ListBox1.List = meAr sein.
War nur zur Kontrolle eine zweite eingebaut.
Gruß Tino
AW: Listbox sortieren
23.09.2009 07:45:02
kirsche
hallo tino,
hab den code gleich mal ausprobiert und es funktioniert einwandfrei. danke danke danke
mit Do - Loop schleifen kenne ich mich noch nicht so aus und hab mich da nicht so ran getraut.
gruß kirsche
AW: Listbox sortieren in Excel-Tabelle
22.09.2009 20:08:24
Daniel
Hi
warum aufwendig nachprogrammieren, was in Excel doch schon vorhanden ist?
die einfachste möglichkeit ist, den Inhalt der Listbox an eine freie Stelle in den Exceltabellen zu kopieren, dort die Daten mit der Excelfunktion "Sortieren" zu bearbeiten und dann wieder in die Listbox einzulesen.
das funktioniert dann in etwa so, die Sortierung efolgt in einem neuen Tabellenblatt, daß anschießend wieder gelöscht wird:
With Sheets.Add
.Cells(1, 1).Resize(ListBox2.ListCount, ListBox2.ColumnCount) = ListBox2.List
.Cells(1, 1).Sort Key1:=.Cells(1, 1), order1:=xlDescending, header:=xlNo
ListBox2.List = .Cells(1, 1).CurrentRegion.Value
Application.DisplayAlerts = False
.Delete
Application.DisplayAlerts = True
End With
Gruß, Daniel
Anzeige
AW: Listbox sortieren in Excel-Tabelle
23.09.2009 08:56:28
kirsche
hallo daniel,
danke für deinen tip, ich habe den code von tino getestet und mich dafür entschieden.
gruß kirsche

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige