Beitrag aus SmartTools Access Weekly
Memo- und Listenfelder zeilenweise sortieren, Teil 1
Access 365 2021 2019 2016 2013 2010
In Ihren Datenbanken verwenden Sie regelmäßig Memofelder, in denen Informationen zeilenweise abgelegt sind. Wenn Sie den Inhalt eines solchen Memofeldes sortieren möchten, finden Sie dazu in Access oder VBA keine Unterstützung. Ähnliches gilt für Listenfelder, die Sie per "AddItem" aus einem Array aufbauen oder für Kombinationsfelder, bei denen Sie aus einem Array eine Werteliste zusammensetzen und zuweisen möchten. Auch für diese Steuerelemente suchen Sie vergeblich nach einer Sortierfunktion. In diesem zweiteiligen Tipp stellen wir eine Lösung vor, die Sie zukünftig für alle Sortieraufgaben in Ihren Datenbanken heranziehen können.
Basis ist eine Prozedur "QuickSortArray", der Sie als Parameter ein String-Array (arrStrings) und den Index des untersten (lBottom) und obersten Elementes (lTop) übergeben. Standardmäßig sortiert die Routine aufsteigend, über einen optionalen Parameter "DESC" können Sie durch die Angabe von "True" aber auch eine absteigende Sortierung veranlassen. Um die Lösung in Ihren Datenbanken zu nutzen, kopieren Sie zunächst die folgende Prozedur in ein neues oder vorhandenes Modul:
Public Sub QuickSortArray( _
ByRef arrStrings, _
ByVal lBottom As Long, _
ByVal lTop As Long, _
Optional DESC As Boolean = False)
Dim lFirst As Long, lLast As Long
Dim varCheck As Variant, varSwap As Variant
lFirst = lBottom
lLast = lTop
varCheck = arrStrings((lBottom + lTop) / 2)
Do While (lFirst <= lLast)
If Not DESC Then 'Aufsteigend
While (arrStrings(lFirst) < varCheck And _
lFirst < lTop)
lFirst = lFirst + 1
Wend
While (varCheck < arrStrings(lLast) And _
lLast > lBottom)
lLast = lLast - 1
Wend
Else 'Absteigend
While (arrStrings(lFirst) > varCheck And _
lFirst < lTop)
lFirst = lFirst + 1
Wend
While (varCheck > arrStrings(lLast) And _
lLast > lBottom)
lLast = lLast - 1
Wend
End If
If (lFirst <= lLast) Then
varSwap = arrStrings(lFirst)
arrStrings(lFirst) = arrStrings(lLast)
arrStrings(lLast) = varSwap
lFirst = lFirst + 1
lLast = lLast - 1
End If
Loop
If (lBottom < lLast) Then
QuickSortArray arrStrings, lBottom, lLast, DESC
End If
If (lFirst < lTop) Then
QuickSortArray arrStrings, lFirst, lTop, DESC
End If
End Sub
Auf die Erklärung des QuickSort-Algorithmus verzichten wir an dieser Stelle; er dürfte jedem Programmierer hinlänglich bekannt sein. Um nun auf der Prozedur "QuickSortArray" aufbauend die Zeilen eines Memofeldes zu sortieren, gehen Sie folgendermaßen vor:
- Legen Sie unter oder neben dem Memofeld eine Schaltfläche Sortieren mit dem Namen "btnSort" und daneben ein Kontrollkästchen Absteigend mit dem Namen "cbDESC" und dem Standardwert "0" (Kontrollkästchen nicht aktiviert) an.
- Kopieren Sie für die Ereignisprozedur "Beim Klicken" der Schaltfläche folgende Anweisungen in den VBA-Editor:
Dim strText As String
Dim tmp() As String
strText = Me.Memo
tmp = Split(strText, vbCrLf)
QuickSortArray tmp, 0, UBound(tmp) - 1, Me.cbDESC
strText = Join(tmp, vbCrLf)
Me.Memo = strText
- "Memo" ersetzen Sie dabei durch den Namen des Memofeldes in Ihrem Formular. Die Anweisungen teilen zunächst den in "strText" übertragenen Inhalt des Memofeldes anhand des Trennzeichens "vbCrLf" (Zeilenumbruch) in ein Array auf, das anschließend per "QuickSortArray" sortiert wird. Das sortierte Array setzen wir dann per "Join" mit Zeilenumbrüchen als Trenner wieder in "strText" zusammen und weisen das Ergebnis dem Memofeld zu.
- Speichern Sie die Änderungen und lassen Sie das Formular testweise anzeigen.
In Zukunft können Sie nun den Inhalt Ihres Memofeldes per Mausklick wahlweise auf- oder absteigend sortieren. Wie Sie "QuickSortArray" mit Listen- und Kombinationsfeldern einsetzen, erläutern wir in der nächsten Ausgabe.