Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Listbox nach anderer Spalte sortieren
14.07.2016 10:57:39
Alex
Hallo zusammen,
ich möchte in meiner Listbox die Ergebnisse alphabetisch sortieren und verwende dafür folgenden Code.
Dim intIndexA As Integer
Dim intIndexB As Integer
For intIndexA = 0 To Me.LIB1.ListCount - 1
For intIndexB = 0 To intIndexA - 1
If UCase(Me.LIB1.List(intIndexB)) > UCase(Me.LIB1.List(intIndexA)) Then
sTemp = Me.LIB1.List(intIndexB)
Me.LIB1.List(intIndexB) = Me.LIB1.List(intIndexA)
Me.LIB1.List(intIndexA) = sTemp
End If
Next intIndexB
Next intIndexA

Die Sortierung funktioniert super, leider wird nur nach der ersten Spalte sortiert. Kann ich die Funktion anpassen, dass nur nach der zweiten oder nur nach der dritten Spalte der Listbox sortiert wird?
Vielen Dank für eure Hilfe.
Alex

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

Betreff
Datum
Anwender
Anzeige
AW: Listbox nach anderer Spalte sortieren
14.07.2016 11:03:31
Alex
Edit:
Die o.g. Funktion sortiert auch nur die erste Spalte der Listbox. Gibt es eine Funktion, die dies spaltenübergreifend erledint?

Bubblesort Array mit Spaltenauswahl
14.07.2016 14:53:07
Michael
Hi Alex,
am einfachsten ist es, Du steckst den kompletten Inhalt der Listbox in ein standardmäßig verstecktes Tabellenblatt und nimmst die range.sort; das klingt erst mal umständlich, hat aber den Vorteil, daß Du dann ohne großes Zutun auch nach mehreren Kriterien gleichzeitig sortieren kannst (z.B. Nachname & Vorname).
Nachfolgend eine Lösung, die alle Spalten eines Arrays sortiert: HIER wird ein Array aus einem Tabellenbereich verwendet, das beginnt immer ab 1, während ein Array, das Du aus LIB1.List zuweist, mit 0 beginnt: das ist bei den Spaltennummern zu beachten.
Der Algo ist insoweit optimiert, als ein Array erzeugt wird, das die "originalen" Zeilennummern enthält sowie die Begriffe aus der zu sortierenden Spalte.
Beides wird sortiert, und anschließend erst werden die kompletten Werte des Gesamt-Arrays anhand der soeben mitsortierten Zeilennummern zugewiesen.
Makro:
Option Explicit
Public a, ULv, ULn
Const ULvon = "ß,Ä,Ö,Ü", ULnach = "ss,AE,OE,UE"
Sub BS_Aufrufen()
a = Range("B2").CurrentRegion
ULv = Split(ULvon, ",")
ULn = Split(ULnach, ",")
Bubblesort (Range("E4"))
Range("H2").Resize(UBound(a), UBound(a, 2)) = a
End Sub
Function UL(s$) As String
Dim i&
For i = 0 To 3
s = Replace(s, ULv(i), ULn(i))
Next
UL = s
End Function
Sub Bubblesort(sp&)  ' sp = Spaltennr.
Dim s, b, stemp0, stemp1
Dim i&, k&, iA&, iB&
ReDim s(LBound(a) To UBound(a), 1)
For i = LBound(a) To UBound(a)
s(i, 0) = i
s(i, 1) = UL(UCase(a(i, sp))) ' einmal reicht...
Next
Range("E10").Resize(UBound(s), 2) = s
MsgBox "Das ist das Array s vor dem Sortieren"
For iA = LBound(a) To UBound(a)
For iB = LBound(a) To iA - 1
If s(iB, 1) > s(iA, 1) Then
stemp0 = s(iB, 0): stemp1 = s(iB, 1)
s(iB, 1) = s(iA, 1): s(iB, 0) = s(iA, 0)
s(iA, 0) = stemp0: s(iA, 1) = stemp1
End If
Next iB
Next iA
Range("G10").Resize(UBound(s), 2) = s
MsgBox "Das ist das Array s nach dem Sortieren"
b = a
For i = LBound(a) To UBound(a)
For k = LBound(a, 2) To UBound(a, 2)
a(i, k) = b(s(i, 0), k)
Next
Next
MsgBox "Jetzt wurde a anhand der Nr. in s aufgefüllt."
End Sub

Die Function UL sortiert die Umlaute richtig ein, sonst kommt Mz vor Mü...
Mit Spieldatei: https://www.herber.de/bbs/user/107013.xlsm
Schöne Grüße,
Michael

Anzeige
AW: Bubblesort Array mit Spaltenauswahl
14.07.2016 15:38:58
Alex
Hallo Michael,
vielen Dank für deine Antwort.
Die Alternative die Daten in ein extra Tabellenblatt zu schreiben ist für mich nicht praktikabel, da es sehr viele Daten werden könnten.
Inzwischen habe ich foglenden Code probiert und er funktioniert auch super:

Public Sub sortieren_Name(lngUgrenze As Long, lngOgrenze As Long)
Dim lngIndex1 As Long, lngIndex2 As Long, strElement As String
Dim strZwischenspeicher(0 To 3) As String, bytIndex As Byte
lngIndex1 = lngUgrenze
lngIndex2 = lngOgrenze
For bytIndex = 0 To 3
strZwischenspeicher(bytIndex) = USF_Uebersicht.LIB_Uebersicht.List(Fix((lngUgrenze +  _
lngOgrenze) / 2), bytIndex)
Next
Do
Do While USF_Uebersicht.LIB_Uebersicht.List(lngIndex1, 0) & USF_Uebersicht.LIB_Uebersicht. _
List(lngIndex1, 1) & _
USF_Uebersicht.LIB_Uebersicht.List(lngIndex1, 2) & USF_Uebersicht.LIB_Uebersicht.List( _
lngIndex1, 3)  lngIndex2
If lngUgrenze 
Jetzt würde ich gern noch unterscheiden, welche Zeile ich als Sortierkriterium verwenden möchte. Könnt ihr mir einen Tipp geben, was ich dabei verändern muss?
Vielen Dank und beste Grüße
Alex

Anzeige
AW: Bubblesort Array mit Spaltenauswahl
14.07.2016 18:42:43
Michael
Hi,
Du mußt doch nur das Array aus der Listbox einlesen...
Sub BS_Aufrufen()
a = Me.LIB1.List
ULv = Split(ULvon, ",")
ULn = Split(ULnach, ",")
Bubblesort ([hier die Nr. 0, 1, 2, 3, ...])
Me.LIB1.List = a
End Sub

und die Msgboxen bzw. Ausgaben aus dem unteren Teil rausnehmen.
Mit "VBA gut" wird das doch nicht zu viel verlangt sein.
Schöne Grüße,
Michael

307 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige