Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
908to912
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
908to912
908to912
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

ListBox sortieren / Format zuweisen?

ListBox sortieren / Format zuweisen?
23.09.2007 10:36:00
Heiner
Hallo Forum,
ich wünsche einen schönen guten Morgen.
Zwei Fragen habe ich an euch...
1. Ist es möglich, eine ListBox zu sortieren und wenn ja, wie lässt sich das realisieren?
In meiner UserForm1 habe ich die ListBox1 plaziert, die mit Werten aus Tabelle 1 befüllt wird. Leider unsortiert!
Die ListBox sollte, wenn möglich, in der Reihenfolge Spalte 2 und anschliessend Spalte 3 sortiert werden.
2. Ist es möglich, Spalten in der ListBox ein bestimmtes Format zuzuweisen und wenn ja, wie wirds gemacht?
In der Spalte 4 sollen Zahlenwerte im Format 0,00 dargestellt werden.

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

Betreff
Datum
Anwender
Anzeige
AW: ListBox sortieren / Format zuweisen?
23.09.2007 10:46:40
Heiner
Hatte ich vergessen beizufügen...
Hier ist der Code, vielleicht kann jemand damit ein wenig basteln?

Private Sub UserForm_Activate()
With ListBox1
.ColumnWidths = "35;100;100;50;40"
.ColumnCount = 6
End With
End Sub



Private Sub UserForm_Initialize()
Dim lRow As Long
Dim lastRow As Long
ListBox1.Clear
lastRow = Sheets("Tabelle1").Range("B" & Sheets("Tabelle1").Rows.Count).End(xlUp).Row
For lRow = 4 To lastRow
If Sheets("Tabelle1").Cells(lRow, 2)  "" Then
ListBox1.AddItem (Sheets("Tabelle1").Cells(lRow, 2))
ListBox1.List(ListBox1.ListCount - 1, 1) = Sheets("Tabelle1").Cells(lRow, 5)
ListBox1.List(ListBox1.ListCount - 1, 2) = Sheets("Tabelle1").Cells(lRow, 6)
ListBox1.List(ListBox1.ListCount - 1, 3) = Sheets("Tabelle1").Cells(lRow, 10)
ListBox1.List(ListBox1.ListCount - 1, 4) = Sheets("Tabelle1").Cells(lRow, 11)
End If
Next lRow
End Sub


Danke für eure Hilfe!
Grüsse, Heiner

Anzeige
AW: ListBox sortieren / Format zuweisen?
23.09.2007 11:11:05
Josef
Hallo Heiner,
das geht so. (Code zum Sortieren von Nepumuk)
' **********************************************************************
' Modul: UserForm1 Typ: Userform
' **********************************************************************

Option Explicit

Private Sub UserForm_Activate()
With ListBox1
    .ColumnWidths = "35;100;100;50;40"
    .ColumnCount = 6
End With
End Sub

Private Sub UserForm_Initialize()
Dim lRow As Long
Dim lastRow As Long
Dim vtmp() As Variant
ListBox1.Clear
lastRow = Sheets("Tabelle1").Range("B" & Sheets("Tabelle1").Rows.Count).End(xlUp).Row
With ListBox1
    For lRow = 4 To lastRow
        If Sheets("Tabelle1").Cells(lRow, 2) <> "" Then
            .AddItem (Sheets("Tabelle1").Cells(lRow, 2))
            .List(.ListCount - 1, 1) = Sheets("Tabelle1").Cells(lRow, 5)
            .List(.ListCount - 1, 2) = Sheets("Tabelle1").Cells(lRow, 6)
            .List(.ListCount - 1, 3) = Format(Sheets("Tabelle1").Cells(lRow, 10), "#,##0.00")
            .List(.ListCount - 1, 4) = Sheets("Tabelle1").Cells(lRow, 11)
        End If
    Next
    
    vtmp = .List
    
    Call prcSort(Array(1, 2), vtmp)
    
    .List = vtmp
End With
End Sub


' Code Max Kaffl 2005

Private Sub prcSort(vntSortArray As Variant, vntArray() As Variant)
Dim intIndex As Integer
Dim lngIndex1 As Long, lngIndex2 As Long, lngRowsArray() As Long
Dim lngRowsCount As Long, lngRangeCount As Long
Dim vntTemp As Variant
Redim lngRowsArray(0 To 1, 0 To UBound(vntArray) * 2)

'Array für den 1. Sortierlauf
lngRowsArray(0, 0) = LBound(vntArray)
lngRowsArray(0, 1) = UBound(vntArray)
lngRowsCount = 1

For intIndex = LBound(vntSortArray) To UBound(vntSortArray)
    
    'Wenn eine Spalte angegeben
    If vntSortArray(intIndex) <> 0 Then
        lngRangeCount = -1
        
        'Schleife zum sortieren der einzelnen Bereiche
        For lngIndex1 = 0 To lngRowsCount Step 2
            
            'Sortieren des Bereichs, wenn Zeilenzahl größer 1
            If lngRowsArray(0, lngIndex1) <> lngRowsArray(0, lngIndex1 + 1) Then
                
                Call prcQuickSort(Clng(lngRowsArray(0, lngIndex1)), _
                    Clng(lngRowsArray(0, lngIndex1 + 1)), Cint(Abs(vntSortArray(intIndex))), _
                    Cbool(vntSortArray(intIndex) > 0), vntArray())
                
                'sortierten Bereich merken
                lngRangeCount = lngRangeCount + 2
                lngRowsArray(1, lngRangeCount - 1) = lngRowsArray(0, lngIndex1)
                lngRowsArray(1, lngRangeCount) = lngRowsArray(0, lngIndex1 + 1)
                
            End If
        Next
        
        lngRowsCount = -1
        
        'Durchsuchen der soeben sortierten Spalte nach Wertewechsel
        For lngIndex1 = 0 To lngRangeCount Step 2
            
            '1. Zeile des zu sortierenden Bereichs
            vntTemp = vntArray(lngRowsArray(1, lngIndex1), Abs(vntSortArray(intIndex)))
            lngRowsCount = lngRowsCount + 1
            lngRowsArray(0, lngRowsCount) = lngRowsArray(1, lngIndex1)
            
            'Suche nach Wechsel innerhalb des Bereichs
            For lngIndex2 = lngRowsArray(1, lngIndex1) To lngRowsArray(1, lngIndex1 + 1)
                If vntTemp <> vntArray(lngIndex2, Abs(vntSortArray(intIndex))) Then
                    lngRowsCount = lngRowsCount + 2
                    lngRowsArray(0, lngRowsCount - 1) = lngIndex2 - 1
                    lngRowsArray(0, lngRowsCount) = lngIndex2
                    vntTemp = vntArray(lngIndex2, Abs(vntSortArray(intIndex)))
                End If
            Next
            
            'letzte Zeile des zu sortierenden Bereichs
            lngRowsCount = lngRowsCount + 1
            lngRowsArray(0, lngRowsCount) = lngRowsArray(1, lngIndex1 + 1)
            
        Next
    End If
Next
End Sub

Private 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

Gruß Sepp

Anzeige
AW: ListBox sortieren / Format zuweisen?
23.09.2007 11:25:00
Christoph
Hallo Heiner,
zum Sortieren könntest du:
- zuvor die Tabelle sortieren
oder
- die Tabellenwerte in ein Array einlesen, das Array sortieren und dann die Listbox mit dem Array füllen (siehe Code von Sepp)
oder
- statt der ListBox das "ListView"-Element verwenden. Hier kann Sortierung eingestellt werden oder aber auch durch Klick auf die ColumnHeader neu sortiert werden.
Formate lassen sich nicht zu einzelnen Spalten der Listbox zuweisen.
Beim ListView-Element ist es sowohl möglich Formate (fett, Farbe, ...) einzelnen Einträgen zuzuweisen als auch ein Bild zu hinterlegen, so dass zB eine einzelne Spalte eine andere Hintergrund-Farbe erhält.
Das ListView ist kein Standard-Element.
Gruß
Christoph

Anzeige
@Christoph
23.09.2007 11:29:00
Josef
Hallo Christoph,
Formate lassen sich nicht zu einzelnen Spalten der Listbox zuweisen
das nicht, aber man kann die Einträge beim Zuweisen formatieren.
Gruß Sepp

AW: ListBox sortieren / Format zuweisen?
23.09.2007 11:47:00
Heiner
Hallo Sepp,
vielen Dank für Deinen Beitrag. Das klappt fantastisch!
Auch Danke an Christoph.
Ich wünsche euch einen schönen Sonntag!
Grüsse, Heiner

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige