VBA Tipp: Suchen (Filtern) im Endlosformular

Aus DBWiki
Wechseln zu: Navigation, Suche

Anforderung

  • Ich möchte ein Endlosformular nach einem oder mehreren Suchbegriffen, die ich in ein oder mehrere Suchfelder eingebe, filtern.
  • Der Filter soll nach jeder Eingabe eines Zeichens aktualisiert werden.

Lösung

Das geht mit folgender Private Sub-Prozedur, die im zugehörigen Formularmodul hinterlegt wird. In dieser Prozedur werden als Beispiel folgende Feldnamen verwendet:

  • Vier ungebundene Textfelder im Formularkopf mit Namen SNachname, SVorname, SStraße und STelefon, die als Suchfelder verwendet werden.
  • Die vier Formularfelder, nach denen gefiltert werden soll, heißen Nachname, Vorname, Straße und Telefonnummer.
Private Sub FilterSetzen()
 
   ' Quelle: http://www.dbwiki.net/
 
   Dim ctl       As Access.Control
   Dim strFilter As String
 
   ' Aktuelles Suchfeld in Variable einlesen
   Set ctl = Me.ActiveControl
 
   ctl.Value = ctl.Text
 
   ' strFilter aus den Suchfeldern zusammenstellen
   ' Filter bei Nachname, Vorname und Straße nach Like x*, bei Telefon Filter nach Like *x*
   If Len(Me!SNachname.Value) Then strFilter = strFilter & " AND Nachname Like '" & Me!SNachname.Value & "*'"
   If Len(Me!SVorname.Value) Then strFilter = strFilter & " AND Vorname Like '" & Me!SVorname.Value & "*'"
   If Len(Me!SStraße.Value) Then strFilter = strFilter & " AND Straße Like '" & Me!SStraße.Value & "*'"
   If Len(Me!STelefon.Value) Then strFilter = strFilter & " AND Telefonnummer Like '*" & Me!STelefon.Value & "*'"
 
   ' Die ersten 5 Zeichen des strFilter abschneiden
   strFilter = Mid(strFilter, 6)
 
   ' Filter setzen
   Me.Filter = strFilter
   Me.FilterOn = True
 
   ' Bei leerem Suchfeld geht der Fokus verloren, daher wieder setzen
   ctl.SetFocus
 
   ' Cursor ans Ende des eingegeben Textes setzen (nach DonKarl FAQ 4.24)
   ctl.SelStart = Len("" & ctl)
 
   ' Speicher freigeben
   Set ctl = Nothing
 
End Sub


Folgender Code wird jedem Suchfeld dem Ereignis Bei Änderung hinterlegt. Das Wort Suchfeld muß durch den entsprechenden Namen des Suchfeldes, z.B. SNachname, SVorname, SStraße oder STelefon ersetzt werden.

Private Sub Suchfeld_Change()
 
   Call FilterSetzen
 
End Sub

Erweiterte Möglichkeit

Da der Benutzer in der Regel mehrere Zeichen schnell hintereinander (also einen kompletten Suchbegriff) ins Suchfeld eingibt, ist es sinnvoll, daß die Anwendung erst einmal einen kurzen Moment (z.B. 500 ms) wartet, bis der Benutzer mit dem Tippen fertig ist, bevor der Filtervorgang ausgelöst wird. Das erreicht man, indem man die Filterprozedur im Timer des Formulars ablaufen lässt.


Dazu wird folgender Code jedem Suchfeld dem Ereignis Bei Änderung hinterlegt. Das Wort Suchfeld muß durch den entsprechenden Namen des Suchfeldes, z.B. SNachname, SVorname, SStraße oder STelefon ersetzt werden.

Private Sub Suchfeld_Change()
 
   'Timer einschalten. 
   'Der Filter wird erst nach einer Wartezeit von 500 ms gesetzt.
   Me.TimerInterval = 500
 
End Sub


Im Formular-Ereignis Bei Zeitgeber wird folgender Code hinterlegt:

Private Sub Form_Timer()
 
   'Filter nach Timerzeit setzen
   Call FilterSetzen
 
   'Timer ausschalten
   Me.TimerInterval = 0
 
End Sub


Wiki hinweis.png

Hinweis:

Die Formulareigenschaft Anfügen zulassen muss auf Ja stehen und die zugrundeliegende Abfrage muss aktualisierbar sein, sonst wird, falls kein Datensatz gefunden wird,
  • in einer mdb-Datenbank der Fehler 2185 ausgelöst
  • in einer accdb-Datenbank der Filtervorgang abgebrochen


Wikilinks