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 2

Access 365 2021 2019 2016 2013 2010

Im ersten Teil dieses Tipps hatten wir zur zeilenweisen Sortierung von Memo-, Listen- und Kombinationsfeldern zunächst die Basis in Form der Prozedur "QuickSortArray" geschaffen und gezeigt, wie Sie eine Schaltfläche und ein Kontrollkästchen in ein Formular zur wahlweise auf- oder absteigenden Sortierung der Zeilen eines Memofeldes einbauen. Im zweiten Teil geht es nun um den Einsatz dieser Prozedur mit Listen- und Kombinationsfeldern.

Ausgangspunkt ist ein Array "arrPersonal" mit Mitarbeiter- und Abteilungsnamen sowie Telefonnummern, das aus einer CSV-Datei gefüllt wird. Diese Namen und Nummern sollen nun in einer Auswahl "Zuständig" angezeigt werden. Das Array enthält die Angaben im Format "Mitarbeitername; Abteilungsname; Durchwahl", in dem es aber nicht sortierbar ist, da es durch unterschiedliche lange Mitarbeiternamen zu Verfälschungen kommen würde. Im ersten Schritt müssen wir also dafür sorgen, dass die Mitarbeiter- und Abteilungsnamen alle die gleiche Länge aufweisen:

'Im allgemeinen Teil des Formulars:
Dim arrPersonal As Variant

'In Form_Load
Dim X$, I&, J&
Dim tmp As Variant

'CSV-Datei simulieren
arrPersonal = Array( _
  "Müller;Einkauf;123", _
  "Schmidt;Lager;456", _
  "Krüger;Buchhaltung;789")
For I = 0 To UBound(arrPersonal)
  tmp = Split(arrPersonal(I), ";")
  For J = 0 To 1 '0= Mitarbeiter, 1= Abteilung
    X$ = Space$(50)
    LSet X$ = tmp(J)
    tmp(J) = X$
  Next J
  arrPersonal(I) = Join(tmp, ";")
Next I

QuickSortArray arrPersonal, 0, UBound(arrPersonal)

For I = 0 To UBound(arrPersonal)
  tmp = Split(arrPersonal(I), ";")
  Me.lstTest.AddItem Trim$(tmp(0))
Next I

Zunächst gehen wir in einer "For I"-Schleife alle Einträge des Arrays "arrPersonal" durch und teilen den Inhalt anhand des Trennzeichens ";" in ein Array "tmp" auf. Dessen Elemente "0 und "1" werden in einer zweiten "For J"-Schleife per "LSet" auf eine einheitliche Länge von 50 Zeichen gebracht und wieder zurück in das Array "arrPersonal" geschrieben. Das lässt sich nun zuverlässig sortieren. Im Anschluss übertragen wir den sortierten Inhalt per "AddItem" in ein Listenfeld "lstTest" - hier können Sie bei Bedarf auch ein Kombinationsfeld verwenden.

Nach einer Auswahl können Sie die Daten dann beispielsweise wie folgt in Felder eines Formulars übertragen:

Private Sub lstTest_Click()
  Dim Idx&
  Dim tmp As Variant

  Idx = Me.lstTest.ListIndex
  tmp = Split(arrPersonal(Idx), ";")
  Me.txtMitarbeiter = Trim$(tmp(0))
  Me.txtAbteilung = Trim$(tmp(1))
  Me.txtDurchwahl = tmp(2)

End Sub

Im ersten Schritt lesen wir über "ListIndex" den Index des angeklickten Eintrages aus. Darüber greifen wir dann auf die betreffende Zeile im Array "arrPersonal" zu und teilen den Inhalt anhand des Trennzeichens ";" in ein Array "tmp" auf. Dessen einzelne Elemente werden schließlich den dazugehörenden Formularfeldern zugewiesen, wobei "Trim$()" dafür sorgt, dass die für die Sortierung hinzugefügten Leerzeichen wieder entfernt werden.