Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1576to1580
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 sortieren

ListBox sortieren
23.08.2017 14:57:43
Siegfried
Hallo zusammen,
ich möchte die Einträge in einer ListBox sortieren und habe in der Hilfe folgenden Code gefunden:
Dim iLast As Integer, iNext As Integer
Dim iTmp
With Frm_Anm.Lst_Mit
For iLast = 0 To .ListCount - 1
For iNext = iLast + 1 To .ListCount - 1
If .List(iLast) größer .List(iNext) Then
iTmp = .List(iLast, 0)
Debug.Print iTmp
.List(iLast) = .List(iNext)
.List(iNext) = iTmp1
End If
Next iNext
Next iLast
End With
Der Code funktioniert auch mit dem Eintrag in der ersten Spalte.
Wie muss ich den Code ändern, damit auch die Einträge der zweiten Spalte sortiert werden?
Gruß
Siegfried

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: ListBox sortieren
23.08.2017 16:29:23
ChrisL
Hi Siegfried
Such mal nach:
mehrdimensionales array sort site:www.herber.de
Falls du die Daten nicht bereits vor dem Einlesen in die ListBox sortieren willst, gibt es fix fertige Sortierfunktionen. Bei mehrspaltigen Array/Datenfelder sieht die Sortierfunktion doch etwas komplizierter aus, so etwas möchte ich nicht neu programmieren ;)
Die List-Eigenschaft (ListBox1.List) ist übrigens bereits ein Array/Datenfeld. Nicht ganz sicher bin ich ob du das Array/Datenfeld noch drehen/transponieren musst (horizontal/vertikal)...
Application.Transpose(ListBox1.List)
cu
Chris
Anzeige
AW: ListBox sortieren
23.08.2017 16:44:18
Siegfried
Hi Chris,
Danke für den Hinweis.
Da werde ich mich mal umsehen.
bisher habe ich die Daten vor dem Einlesen sortiert.
Jetzt wollte ich diesen Umweg vermeiden.
Gruß
Siegfried
AW: ListBox sortieren
23.08.2017 17:22:25
mmat
Hi Siegfried,
oder wie wärs damit:
der folgende Code braucht ein Form mit einer Listbox (2 spaltig) und 2 Commandbuttons. Bei der Initialisierung wird aus Spalte A und B des aktuellen Blattes gelesen und dabei gleich nach Spalte A sortiert. Mit den Knöpfen wird nach beliben nach Spalte 1 oder 2 sortiert.
@Alle: Wenn jemand eine elegantere Methode kennt, eine Listboxzeile zu verschieben, bitte melden !
Private Sub CommandButton1_Click()
sort 0
End Sub
Private Sub CommandButton2_Click()
sort 1
End Sub
Private Sub UserForm_Initialize()
Dim s As String, r As Long, p As Long
r = 1: s = Cells(r, 1)
While (s  "")
p = 0
Do
If ListBox1.List(p, 0)  ListBox1.ListCount - 1
ListBox1.AddItem s, p
ListBox1.List(p, 1) = Cells(r, 2)
r = r + 1: s = Cells(r, 1)
Wend
End Sub
Private Sub sort(col As Long)
Dim n As Long, p As Long, a() As String, i As Long
ListBox1.AddItem " ", 0
ListBox1.List(0, 1) = "0"
ReDim a(ListBox1.ColumnCount - 1)
For n = 2 To ListBox1.ListCount - 1
p = n
While ListBox1.List(n, col) 

Anzeige
AW: ListBox sortieren
23.08.2017 18:06:25
Matthias
Moin mmat! Ein Hinweis noch zu deinem Code. Beim Vergleich sollte man noch prüfen (war ja aber nicht angegeben) ob es "reine" Zahlen sind oder nicht. Der Wert wird aus der LIste als string genommen. Wenn dort aber Zahlen sind, wird aus der Liste 1,2,10 bei der Sortierung 1,10,2.
Zur allgemeinen Frage:
Schneller würde ggf. gehen, wenn man die ganze Liste in ein Blatt kopiert und dort sortiert (Excelintern) und zurückliest.
Alternative dazu wäre, die Liste an ein Array übergeben und dann nur im Array vergleich und ggf. in ein temporäres Array schreiben. Am Ende dann das temp. Array als Liste an die Listbox geben. Das sollte (ungetestet) ggf. schneller sein, als immer auf das Listboxelement zuzugreifen und dort Einträge zu schreiben und zu löschen. Macht man idR ja beim Zugriff auf ein Tabellenblatt auch nicht, weil es Zeit kostet. ISt nur eine Theorie, weiß nicht, ob man das bei normalen Listen überhaupt zeitlich merkt.
VG
Anzeige
AW: ListBox sortieren
24.08.2017 09:02:19
mmat
Hallo Matthias,
richtig, bei größeren Datenmengen (so ab 10000 Zeilen schätze ich mal) wird das Verfahren wahrscheinlich ineffizient, so dass man sich eine andere Strategie überlegen muß.
Und natürlich ist das Verfahren String. Ich sollte vielleicht der Vollständigkeit halber erwähnen, das in diesem Programmteil Werte in die Tabelle geschrieben werden, die kleiner sein müssen wie jeder in der jeweiligen Spalte vorkommende Wert.
ListBox1.AddItem " ", 0
ListBox1.List(0, 1) = "0"
Ich hab für den Siegfried aber ganz bewusst ein simples in-place Verfahren gewählt. Diese hat eben nur den einen Schönheitsfehler (in meinen Augen ...), dass mir das Verschieben einer Zeile recht unelegant erscheint.
Danke fürs Feedback.
vg, MM
Anzeige
AW: ListBox sortieren
24.08.2017 09:15:17
Daniel
Hi
wenn die Listbox mehrere Spalten hat, dann musst du die Tauschaktion:
iTmp = .List(iLast, 0)
.List(iLast) = .List(iNext)
.List(iNext) = iTmp1
nicht nur für die erste Spalte durchführen, sondern in gleicher Weise für alle Spalten, am besten in einer Schleife:
For iSpalte = 0 to .ColumnCount - 1
iTmp = .List(iLast, iSpalte)
.List(iLast, iSpalte) = .List(iNext, iSpalte)
.List(iNext, iSpalte) = iTmp
Next

Gruß Daniel

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige