VBA Grundlagen: Auswahl im Kombinations- und Listenfeld per VBA
Inhaltsverzeichnis
Anforderung
Ich möchte in einem Kombinations- oder Listenfeld
- Werte per VBA setzen (Zeilen auswählen)
- oder Werte auslesen
Alle Einträge (Werte) in einem Kombinations- oder Listenfeld haben den Datentyp String.

Anmerkung: Werden generell keine Spaltenüberschriften verwendet, kann im folgenden Code
- statt .ColumnHeads bzw. Abs(.ColumnHeads) immer der Wert 0 eingesetzt,
- oder das Argument .ColumnHeads bzw. Abs(.ColumnHeads) weggelassen werden.
Kombinations- und Listenfelder
Zeilenanzahl
Um festzustellen, wie viele Zeilen ein Kombinationsfeld oder Listenfeld besitzt, wird die Einstellung der ListCount-Eigenschaft überprüft, und dazu der Bool'sche Wert der Eigenschaft Spaltenüberschriften (0 für Spaltenüberschriften: Nein oder -1 für Spaltenüberschriften: Ja) hinzu addiert.
With Me.EinListenfeld Debug.Print .ListCount + .ColumnHeads End With
Spaltenanzahl
Um festzustellen, wie viele Spalten ein Kombinationsfeld oder Listenfeld besitzt, wird die Einstellung der ColumnCount-Eigenschaft überprüft.
Debug.Print Me.EinListenfeld.ColumnCount
Kombinationsfelder und Listenfelder ohne Mehrfachauswahl
- Die folgenden Codes sind auch für Kombinationsfelder gültig.
- Die Zählweise der Spalten und Zeilen beginnt bei 0.
- Die abgefragten Werte können im Direktfenster dargestellt werden.
Wert abfragen
'Den vom Benutzer ausgewählten Wert abfragen 'Beispiel 1: Wert der gebundenen Spalte Debug.Print Me.EinListenfeld 'Beispiel 2: Wert der 2. Spalte Debug.Print Me.EinListenfeld.Column(1)
'Beliebigen Wert abfragen 'Beispiel: Wert aus Spalte 2, Zeile 3 unter der Berücksichtigung von Spaltenüberschriften abfragen With Me.EinListenfeld Debug.Print .Column(1, 2 + Abs(.ColumnHeads)) End With
Listenindex der ausgewählten Zeile abfragen
Debug.Print Me.EinListenfeld.ListIndex
'Wenn keine Zeile ausgewählt wurde, ist der ListIndex -1 If Me.EinListenfeld.ListIndex = -1 Then MsgBox "Es wurde keine Zeile ausgewählt." End If 'oder alternativ If IsNull(Me.EinListenfeld) Then MsgBox "Es wurde keine Zeile ausgewählt." End If
Prüfen, ob ein bestimmter Listeneintrag existiert
Dim lngSpalte As Long Dim i As Long Dim bolExistiert As Boolean Dim strSuchwert As String strSuchwert = "Aniseed Syrup" 'Spalte 2 lngSpalte = 1 For i = 0 To Me.EinListenfeld.ListCount - 1 If Me.EinListenfeld.Column(lngSpalte, i) = strSuchwert Then bolExistiert = True Exit For Else bolExistiert = False End If Next If bolExistiert = True Then MsgBox "Der Listeneintrag existiert." Else MsgBox "Der Listeneintrag existiert nicht." End If
Wert setzen (auswählen)
Mit folgendem Code kann der Wert nur für die gebundene Spalte des Feldes gesetzt werden. Um den Wert einer anderen als der gebundenen Spalte zu setzen, siehe weiter unten: Listenfelder mit Mehrfachauswahl - Werte setzen (auswählen).
- Wenn der gewünschte Vorgabewert in der Liste nicht existiert, wird kein Eintrag ausgewählt.
- Wenn gewünschter Vorgabewert einen ungültigen Datentyp hat, wird ein Fehler ausgelöst.
'Beispiel: Der Datentyp der gebundenen Spalte ist eine Zahl Me.EinListenfeld = 4
'Beispiel: Der Datentyp der gebundenen Spalte ist ein Datum Me.EinListenfeld = #7/8/1996# 'der 8.7.1996 'Alternativ funktioniert mit der in Deutscland üblichen Datumseinstellung auch Me.EinListenfeld = "8.7.1996" 'der 8.7.1996 'Wenn man unbedingt ein Datum in Textform zuweisen muss oder will, 'wäre jedoch die ISO-Form zu bevorzugen, weil sie keine Mehrdeutigkeiten zulässt. Me.EinListenfeld = "1996-07-08" 'der 8.7.1996
siehe auch Datum ins VBA-Datumsformat (SQL-Format) umwandeln
'Beispiel: Der Datentyp der gebundenen Spalte ist ein Text (String) Me.EinListenfeld = "Aniseed Syrup"
Die erste bzw. letzte Zeile auswählen
'Die erste Zeile auswählen With Me.EinListenfeld .Value = .ItemData(0 + Abs(.ColumnHeads)) End With
'Die letzte Zeile auswählen With Me!MeinListenfeld .Value = .ItemData(.ListCount - 1) End With
Wert abwählen (Auswahl zurücksetzen)
'Um den vom Benutzer ausgewählten Wert zu deaktivieren (Auswahl zurücksetzen), 'wird das Feld auf "Null" gesetzt. Me.EinListenfeld = Null
Listenfelder mit Mehrfachauswahl
Die direkte Abfrage des Wertes eines Listenfelds mit Mehrfachauswahl ergibt immer Null, egal ob Zeilen ausgewählt wurden oder nicht.
Werte abfragen
Anzahl der ausgewählten Zeilen abfragen
Debug.Print Me.EinListenfeld.ItemsSelected.Count
'abfragen, ob mindestens eine Zeile ausgewählt wurde If Me.EinListenfeld.ItemsSelected.Count = 0 Then MsgBox "Es wurde keine Zeile ausgewählt." End If
Listenindex der ausgewählten Zeile abfragen
'Wenn mehrere Zeilen ausgewählt wurden, 'wird der Wert der Zeile mit dem höchsten Index zurückgegeben Debug.Print Me.EinListenfeld.ListIndex
'Wenn keine Zeile ausgewählt wurde, ist der ListIndex -1 If Me.EinListenfeld.ListIndex = -1 Then MsgBox "Es wurde keine Zeile ausgewählt." End If
Die vom Benutzer ausgewählten Einträge auslesen
Dim varElement As Variant With Me.EinListenfeld For Each varElement In .ItemsSelected 'Zeilenindex (Laufende Nummer) auslesen Debug.Print varElement 'Inhalt der gebundenen Spalte auslesen Debug.Print .ItemData(varElement) 'Inhalt der Spalte 3 auslesen Debug.Print .Column(2, varElement) Next varElement End With
Werte setzen (auswählen)
Dim i As Long Dim lngSpalte As Long Dim varWert As Variant 'Beispiel für Zahl varWert = 4 'Spalte 1 lngSpalte = 0 ' 'Alternativ: Beispiel für Text ' varWert = "Aniseed Syrup" ' 'Spalte 3 ' lngSpalte = 2 With Me!EinListenfeld For i = 0 + Abs(.ColumnHeads) To .ListCount - 1 Debug.Print .Column(lngSpalte, i) If .Column(lngSpalte, i) = CStr(varWert) Then .Selected(i) = True End If Next End With
Dim i As Long Dim lngSpalte As Long Dim varWert As Variant 'Beispiel für Datum varWert = "8.7.1996" 'Spalte 1 lngSpalte = 0 With Me.EinListenfeld For i = 0 + Abs(.ColumnHeads) To .ListCount - 1 If CDate(.Column(lngSpalte, i)) = CDate(varWert) Then .Selected(i) = True End If Next End With
Die erste bzw. letzte Zeile auswählen
'Erste Zeile in einem Listenfeld (mit oder ohne Mehrfachauswahl) auswählen With Me.EinListenfeld .Selected(0 + Abs(.ColumnHeads)) = True End With 'Letzte Zeile in einem Listenfeld (mit oder ohne Mehrfachauswahl) auswählen With Me.EinListenfeld .Selected(.ListCount - 1) = True End With
Werte abwählen (Auswahl zurücksetzen)
'Um die vom Benutzer ausgewählten Werte schnell abzuwählen, wird die RowSource neu gesetzt. With Me.EinListenfeld .RowSource = .RowSource End With