Tipp 2.17 - Combobox: Eintrag per Doppelklick

Wie kann ich den nächsten Eintrag eines Kombinationsfeldes mit einem Doppelklick auswählen?

Im Eigenschaftsfenster der Microsoft Access Formulare und Berichte haben Sie die Möglichkeit, viele Einstellungen über die Kombinationsfelder mit einem Doppelklick auszuwählen. Das bedeutet, wenn Sie eine Einstellung doppelklicken, wird automatisch der nächste Eintrag aus der Liste ausgewählt und angezeigt. Dieses nützliche Verhalten können Sie auch für Ihre eigenen Kombinationsfelder implementieren.

Alles was man dazu benötigt, ist eine globale Funktion. Der Funktion CboNextValue können Sie über zwei optionale Parameter zum einen die Bezeichnung der betreffende Combobox (z.B. "cboTest") und zum anderen die Richtung der Auswahl übergeben, je nachdem, ob der nächste (1) oder der vorherige Eintrag (-1) ausgewählt werden soll. Kopieren Sie einfach nachfolgenden Quellcode in die Zwischenablage und fügen Sie anschließend den Inhalt der Zwischenablage in ein neues Modul ein. Die Aufrufparameter finden Sie im Quellcode beschrieben.

Die Funktion

Beispiel:

' Combobox next value
Public Function CboNextValue(Optional psCtlName As String = vbNullString, _
                             Optional plNext As Long = 1) As Boolean
  '// =====================================================
  '// Methode   | Nächster Eintrag einer Combobox mit
  '               Doppelklick
  '// -----------------------------------------------------
  '// Parameter | psCtlName - Name des Controls (optional)
  '               plNext    - Richtung (optional)
  '// -----------------------------------------------------
  '// Rückgabe  | Boolean = True=i.O., False=Probleme
  '// -----------------------------------------------------
  '// Erstellt  | Manuela Kulpa
  '//           | EDV Innovation & Consulting - Dormagen
  '// -----------------------------------------------------
  '// Beispielaufruf:
  '// im Formular beim jeweiligen Kombinationsfeld
  '   Eigenschaft: Beim Doppelklick =CboNextValue()
  '// =====================================================
 
  Dim cbo As Control
  Dim lCount As Long
 
  On Error GoTo CboNextValue_Err
 
  ' Initialisierung
  CboNextValue = False
 
  ' Wenn kein Controlname übergeben wurde,
  If psCtlName = vbNullString Then
    ' dann aktuelles Steuerelement ermitteln
    Set cbo = Screen.ActiveControl
  Else
    ' sonst übergebenes Control in der aktuellen
    ' Form zuweisen
    Set cbo = Screen.ActiveForm(psCtlName)
  End If
 
  With cbo
    ' Steuerelement aktivieren
    .SetFocus
 
    ' Ist das Steuerelement überhaupt ein
    ' Kombinationsfeld?
    If .ControlType = acComboBox Then
      ' Haben wir überhaupt Einträge im
      ' Kombinationsfeld?
      If .ListCount + .ColumnHeads > 0 Then
        ' Anzahl der Zeilen abzüglich Kopfzeilen
        ' ermitteln
        lCount = .ListCount + .ColumnHeads
        ' Je nach gewünschte Richtung
        Select Case plNext
            ' vorheriger Eintrag
          Case -1
            ' Wenn Listenindex kleiner gleich 0,
            If .ListIndex <= 0 Then
              ' dann den letzten Eintrag auswählen
              .ListIndex = lCount - 1
            Else
              ' sonst vorherigen Eintrag auswählen
              .ListIndex = .ListIndex + plNext
            End If
            ' nächstes Element
          Case 1
            ' Wenn Listindex gleich Anzahl Zeile,
            If .ListIndex = lCount - 1 Then
              ' dann ersten Eintrag auswählen
              .ListIndex = 0
            Else
              ' sonst nächsten Eintrag auswählen
              .ListIndex = .ListIndex + plNext
            End If
        End Select
      End If
    End If
  End With
 
  ' alles soweit i.O.
  CboNextValue = True
 
CboNextValue_Exit:
  On Error GoTo 0
  If Not cbo Is Nothing Then Set cbo = Nothing
  Exit Function
 
CboNextValue_Err:
  MsgBox "Fehler " & Err.Number & ": " & _
         Err.Description, vbCritical, _
         "modForms.CboNextValue"
  Resume CboNextValue_Exit
 
End Function
Die Verwendung

Die Funktion CboNextValue kann ohne Übergabe eines Namens auf das aktive Steuerelement angewendet werden. Auf dieser Weise muss keine Anpassung des Aufrufs erfolgen, wenn z.B. das Control umbenannt wird. Um die Funktion anzuwenden, brauchen Sie nur bei der Eigenschaft Beim Doppelklick ihres gewünschten Kombinationsfelder =CboNextValue() hinterlegen.

HinweisEin Hinweis zu den Kopfzeilen (ColumnHeads): Kombinationsfelder können auch Kopfzeilen beinhalten. Der Listindex 0 bezieht sich in dem Fall nicht auf die Kopfzeile, sondern auf den ersten Eintrag danach. Trotzdem wird die Kopfzeile bei der Eigenschaft ListCount für die Anzahl der Zeilen in einem Kombinationsfeld mitgezählt. D.h., eine Liste kann leer sein, obwohl die ListCount-Eigenschaft den Wert 1 zurückgibt. Aus diesem Grund wird die wirkliche Anzahl der Einträge abzüglich der Kopfzeile ermittelt. Dabei ist es praktisch, dass die Eigenschaft ColumnHeads den Wert -1 (True) annimmt, wenn die Kopfzeile angezeigt wird, und den Wert 0, wenn keine Kopfzeile angezeigt wird. Dieser Umstand wird in der Funktion CboNextValue berücksichtigt.