Listenfeldwerte auswählen, abwählen und auslesen

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

Das Listenfeld-Steuerelement ist ein sehr praktisches Steuerelement, wenn es um die Darstellung von Listen ohne größere optische Ansprüche geht. Sie zeigen einfach nur Text in Zeilen und Spalten an und die Inhalte sind nicht direkt bearbeitbar. Gegenüber der Datenblattansicht bieten sie aber auch Vorteile, zum Beispiel die Mehrfachauswahl. Dennoch gibt es einige Dinge, die man beachten muss, wenn man dem Benutzer die richtige Auswahlmöglichkeit bereitstellen möchte – und auch das Auslesen kann gegebenfalls unvorhergesehene Ergebnisse liefern, vor allem nach der Aktualisierung der Inhalte. In diesem Beitrag schauen wir uns die verschiedenen Selektionsmöglichkeiten an und zeigen, wie wir diese auslesen können.

Beispieldaten

Zu Beispielzwecken haben wir eine einfache Tabelle namens tblProdukte mit den Feldern ProduktID, Produktname und Kategorie angelegt (siehe Bild 1).

Beispieldaten der Tabelle tblProdukte

Bild 1: Beispieldaten der Tabelle tblProdukte

Listenfeld anlegen und Daten anzeigen

Ein Listenfeld ist schnell angelegt (siehe Bild 2). Damit es die Daten aus der Beispieltabelle anzeigt, stellen wir die Datensatzherkunft auf die gewünschte Tabelle oder Abfrage ein.

Einfaches Listenfeld

Bild 2: Einfaches Listenfeld

Wir wollen die Daten der Tabelle tblProdukte anzeigen, also legen wir für die Eigenschaft Datensatzherkunft den Wert tblProdukte fest.

Damit zeigt sie im Ausgangszustand jedoch nur das Feld ProduktID an. Der Grund sind die beiden Eigenschaften Spaltenanzahl und Spaltenbreiten.

Die erste steht auf 1, die zweite ist noch leer – was dazu führt, dass die erste Spalte die gesamte Breite einnimmt. Die anzuzeigende Tabelle enthält aber drei Felder.

Damit wir beim Auslesen des oder der ausgewählten Einträge der Tabelle über die Standardeigenschaft Value auf den eindeutigen Wert des gewählten Datensatzes zugreifen können, sollte das entsprechende Feld in der Datensatzherkunft den 1-basierten Index aufweisen, der in der Eigenschaft Gebundene Spalte festgelegt ist. Gleichzeitig wollen wir den Primärschlüsselwert der zugrunde liegenden Datensatzherkunft nicht unbedingt anzeigen.

Dies führt zu den folgenden Einstellungen:

  • Spaltenanzahl: 3 (alle drei Felder der Datensatzherkunft tblProdukte werden angezeigt)
  • Spaltenbreiten: 0cm;3cm (das erste Feld mit dem Index wird ausgeblendet, das zweite mit 3cm Breite angezeigt und das dritte nimmt den Rest der Listenfeldbreite ein)
  • Gebundene Spalte: Bleibt auf dem Wert 1, da die erste Spalte das Primärschlüsselfeld enthält.

Damit erhalten wir da Ergebnis aus Bild 3.

Listenfeld mit den Daten der Tabelle tblProdukte

Bild 3: Listenfeld mit den Daten der Tabelle tblProdukte

Einfachauswahl setzen und auslesen

Standardmäßig ist die Eigenschaft Mehrfachauswahl auf Keine eingestellt, was bedeutet, dass wir maximal nur einen Eintrag gleichzeitig auswählen können.

Wenn wir einen Eintrag anklicken, wird dieser durch einen schwarzen Hintergrund markiert (siehe Bild 4). Auf diese Weise können wir nacheinander verschiedene Einträge selektieren. Allerdings können wir die Auswahl, wenn wir einmal einen Eintrag ausgewählt haben, standardmäßig nicht mehr aufheben. Es ist dann immer ein Eintrag markiert.

Einfachauswahl eines Eintrags

Bild 4: Einfachauswahl eines Eintrags

Wie wir diesen wieder aufheben können, zeigen wir weiter unten.

Um den aktuell markierten Eintrag auszulesen, können wir einfach auf die Eigenschaft Value des Listenfeldes zugreifen. Von außen, zum Beispiel vom Direktbereich aus, sieht das so aus:

  Forms!frmListenfeldProdukte!lstProdukte.Value
2

Da Value die Standardeigenschaft ist, können wir diese auch weglassen:

  Forms!frmListenfeldProdukte!lstProdukte
2

Innerhalb des Klassenmoduls des Formulars greifen wir einfach über folgenden Ausdruck auf den markierten eintrag im Listenfeld zu:

Debug.Print Me.lstProdukte

Weitere Spaltenwerte des aktuellen Eintrags auslesen

Value liefert also den Wert der gebundenen Spalte. Wenn wir auch die übrigen Spalten auslesen wollen, verwenden wir die Column-Eigenschaft mit dem 0-basierten Index der jeweiligen Spalte. In der folgenden Prozedur geben wir nach der Aktualisierung des Listenfeldes den Wert der gebundenen Spalte aus sowie den der Spalten mit den Indizes 1 und 2:

Private Sub lstProdukte_AfterUpdate()
     Debug.Print "Gebundene Spalte: " & Me.lstProdukte.Value
     Debug.Print "Spalte 1: " & Me.lstProdukte.Column(1)
     Debug.Print "Spalte 2: " & Me.lstProdukte.Column(2)
End Sub

Listenfeldeintrag per VBA einstellen

Wollen wir per VBA einen der Einträge selektieren, weisen wir einfach dem Listenfeld den gewünschten Wert der gebundenen Spalte, hier mit dem Primärschlüsselwert gefüllt, zu:

Forms!frmListenfeldProdukte!lstProdukte = 3

Markierung per VBA aufheben

Wenn wir die aktuelle Markierung wieder aufheben wollen, stellen wir das Listenfeld auf den Wert Null ein:

Forms!frmListenfeldProdukte!lstProdukte = Null

Spaltenüberschriften einblenden

Mit der Eigenschaften Spaltenüberschriften können wir die Spaltenüberschriften des Listenfeldes einblenden (siehe Bild 5).

Anzeige von Spaltenüberschriften

Bild 5: Anzeige von Spaltenüberschriften

Diese orientieren sich an den Feldnamen beziehungsweise Beschriftungen der Datensatzherkunft. Wenn wir also nicht die eigentlichen Feldnamen, sondern eine andere Beschritung anzeigen wollen, müssen wir dazu die Eigenschaft Beschriftung des jeweiligen Feldes anpassen.

Diese wird als Spaltenüberschrift übernommen.

Die Spaltenüberschriften können wir per VBA ein- und ausschalten (siehe Formular frmListenfeldProdukte_Spaltenueberschriften:

Private Sub cmdueberschriftenAus_Click()
     Me.lstProdukte.ColumnHeads = False
End Sub
Private Sub cmdueberschriftenEin_Click()
     Me.lstProdukte.ColumnHeads = True
End Sub

Im Formular aus Bild 6 haben wir noch einige weitere Schaltflächen zum Experimentieren mit den Spaltenüberschriften eingebaut.

Experimente mit den Spaltenüberschriften

Bild 6: Experimente mit den Spaltenüberschriften

Wichtig: Die Spaltenüberschrift verändert die Werte, welche die ItemData-Eigenschaft liefert. ItemData(0) liefert ohne Spaltenüberschriften die Werte der ersten Datenzeile, während es mit Spaltenüberschriften den Text der Spaltenüberschrift liefert. Wir brauchen dann also ItemData(1), um den Wert der gebundenen Spalte des ersten Datensatzes zu ermitteln.

Auf die gleiche Weise ändert sich der Wert der Eigenschaft ListCount, der ohne Spaltenüberschriften die tatsächliche Anzahl der enthaltenen Datensätze liefert. Wenn die Spaltenüberschriften aktiviert sind, ist dieser Wert jedoch um 1 größer als ohne.

Ersten Eintrag markieren

Um den ersten Eintrag zu markieren, was manchmal geschehen soll, damit überhaupt ein Eintrag in einem Listenfeld markiert ist, verwenden wir normalerweise einfach:

Me.lstProdukte = Me.lstProdukte.ItemData(0)

Mit ItemData(0) ermitteln wir den Wert der gebundenen Spalte für die erste Zeile und stellen das Listenfeld durch Zuweisung zur Value-Eigenschaft auf diesen Wert ein.

Wenn wir allerdings Spaltenüberschriften anzeigen, wird die Zeile mit den Spaltenüberschriften zur Zeile mit dem Index 0. In diesem Fall müssten wir also wie folgt vorgehen, um die erste Zeile zu markieren:

Me.lstProdukte = Me.lstProdukte.ItemData(1)

Um hier flexibel zu sein, fragen wir vorher ab, ob die Spaltenüberschriften sichtbar sind (siehe Formular frmListenfeldProdukte_Spaltenueberschriften):

Private Sub cmdErsteMarkieren_Click()
     If Me.lstProdukte.ColumnHeads = False Then
         Me.lstProdukte = Me.lstProdukte.ItemData(0)
     Else
         Me.lstProdukte = Me.lstProdukte.ItemData(1)
     End If
End Sub

Letzten Eintrag markieren

Um den letzten Eintrag zu markieren, ermitteln wir zuerst mit der Eigenschaft ListCount die Anzahl der Einträge. Diese entspricht ohne Spaltenüberschriften der tatsächlichen Anzahl der Datensätze, mit Spaltenüberschriften ist der Wert um 1 größer.

ListCount liefert in unserem Fall den Wert 10. Da der Index 0-basiert ist, müssen wir zum Markieren des letzten Eintrags ohne Spaltenüberschriften noch den Wert 1 subtrahieren:

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar