News & Tipps zu Microsoft Access

Lesen Sie hier einige der besten Beiträge aus SmartTools Access Weekly sowie ausgewählte Inhalte anderer E-Mail-Newsletter von SmartTools Publishing rund um Microsoft Access.

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:

  1. 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.
  2. 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
  1. "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.
  2. 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.