VBA Grundlagen: Auswahl im Kombinations- und Listenfeld per VBA

Aus DBWiki
Wechseln zu: Navigation, Suche

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.


Wiki hinweis.png

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
      End If
   Next
 
   If bolExistiert = True Then
      MsgBox "Der Listeneintrag existiert."
   Else
      MsgBox "Der Listeneintrag existiert nicht."
   End If

Wert setzen (auswählen)

Wert für die gebundenen Spalte setzen

Mit folgendem Code kann der Wert nur für die gebundene Spalte des Feldes gesetzt werden.

  • Wenn der gewünschte Vorgabewert in der Liste nicht existiert, wird kein Eintrag ausgewählt.
  • Wenn der gewünschte Vorgabewert einen ungültigen Datentyp hat, wird ein Fehler ausgelöst.

Datentyp Zahl

   'Beispiel: Der Datentyp der gebundenen Spalte ist eine Zahl
   Me.EinListenfeld = 4

Datentyp Text

   'Beispiel: Der Datentyp der gebundenen Spalte ist ein Text (String)
   Me.EinListenfeld = "Aniseed Syrup"

Datentyp Datum

   '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


Wert für eine andere als die gebundene Spalte setzen

Es soll nach einem Wert in einer anderen Spalte gesucht werden, da der Wert der gebundenen Spalte nicht bekannt ist.

   Dim i         As Long
   Dim lngSpalte As Long
   Dim varWert   As Variant
 
   'Beispiel: Der gesuchte Wert ist ein Text
   varWert = "Aniseed Syrup"
'   'Alternativ: Der gesuchte Wert ist eine Zahl
'   varWert = 4
 
   'Der gesuchte Wert ist in Spalte 2
   lngSpalte = 1
 
   With Me!EinListenfeld
 
      For i = 0 + Abs(.ColumnHeads) To .ListCount - 1
         If .Column(lngSpalte, i) = CStr(varWert) Then
            .Selected(i) = True
            ' Zusatzcode für Kombinationsfelder
            .Value = .Column(.BoundColumn - 1, i)
         End If
      Next
 
   End With


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)

Eine oder mehrere Zeilen auswählen (Datentyp Zahl oder Text)

   Dim i         As Long
   Dim lngSpalte As Long
   Dim varWert   As Variant
 
   'Beispiel: Der gesuchte Wert ist eine Zahl
   varWert = 4
   'Spalte 1
   lngSpalte = 0
 
'   'Alternativ: Der gesuchte Wert ist ein Text
'   varWert = "Aniseed Syrup"
'   'Spalte 3
'   lngSpalte = 2
 
   With Me!EinListenfeld
 
      For i = 0 + Abs(.ColumnHeads) To .ListCount - 1
         If .Column(lngSpalte, i) = CStr(varWert) Then
            .Selected(i) = True
         End If
      Next
 
   End With


Eine oder mehrere Zeilen auswählen (Datentyp Datum)

   Dim i         As Long
   Dim lngSpalte As Long
   Dim varWert   As Variant
 
   'Beispiel: Der gesuchte Wert ist ein 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

Wikilinks