Datenvalidierung: Wie kann ich Datenvalidierung in Access implementieren?

Ziel: Müll rausfiltern – bevor er gespeichert wird

Access speichert alles. Auch Blödsinn.
Wenn Du das nicht willst, brauchst Du eigene Prüfungen.
Ich zeig Dir, wie Du Validierung sicher, wiederverwendbar und benutzerfreundlich umsetzt.

Variante 1: Validierung auf Feldebene

In der Tabelle selbst:

  • Feld „PLZ“ → Gültigkeitsregel: Like "#####"
  • Feld „Geburtsdatum“ → <=Date()
  • Eigene Fehlermeldung: „Geburtstag darf nicht in der Zukunft liegen.“

Nachteil: wirkt nur bei direkter Tabellenbearbeitung oder ungebundenen Formularen.

Variante 2: Validierung im Formular (BeforeUpdate)

Private Sub txtPLZ_BeforeUpdate(Cancel As Integer)
    If Not IsNumeric(Me.txtPLZ) Or Len(Me.txtPLZ) <> 5 Then
        MsgBox "Bitte gültige Postleitzahl (5-stellig) eingeben.", vbExclamation
        Cancel = True
    End If
End Sub

So bleibt der Benutzer direkt im Feld.

Variante 3: Validierung im Formular (Form_BeforeUpdate)

Zentrale Prüfung vor Speichern:

Private Sub Form_BeforeUpdate(Cancel As Integer)
    If Nz(Me.txtName, "") = "" Then
        MsgBox "Name darf nicht leer sein.", vbExclamation
        Cancel = True
        Me.txtName.SetFocus
        Exit Sub
    End If

    If Not IsDate(Me.txtGeburtstag) Or Me.txtGeburtstag > Date Then
        MsgBox "Geburtsdatum ungültig.", vbExclamation
        Cancel = True
        Me.txtGeburtstag.SetFocus
        Exit Sub
    End If
End Sub

Schnell. Klar. Verständlich.

Variante 4: Wiederverwendbare Prüffunktion

Public Function IstEmailAdresseGueltig(email As String) As Boolean
    IstEmailAdresseGueltig = email Like "*@*.*"
End Function

Verwendung:

If Not IstEmailAdresseGueltig(Me.txtEmail) Then
    MsgBox "Ungültige E-Mail-Adresse.", vbExclamation
    Cancel = True
    Me.txtEmail.SetFocus
End If

Du kannst beliebige Prüfregeln als Modulfunktion kapseln.

Variante 5: Validierung in SQL-Abfragen

Wenn Du Listen oder Berichte filterst:

SELECT * FROM tblKunden WHERE Email Like "*@*.*" AND Len(Name) > 0

Zum Prüfen von Altdaten. Nicht zum Verhindern beim Eingeben.

Variante 6: Fehler zentral protokollieren

Du willst wissen, wer wie oft fehlerhafte Eingaben macht?

Public Sub LogValidierungsfehler(modul As String, feld As String, text As String)
    CurrentDb.Execute "INSERT INTO tblValidierungsLog (Zeitpunkt, Benutzer, Modul, Feld, Meldung) " & _
                      "VALUES (Now(), '" & Environ("USERNAME") & "', '" & modul & "', '" & feld & "', '" & Replace(text, "'", "''") & "')"
End Sub

Dann:

LogValidierungsfehler "frmKunden", "txtEmail", "Ungültig: " & Me.txtEmail

Variante 7: Validierung beim Import

CSV-Datei wird eingelesen? Erst prüfen, dann speichern.

If Not IsDate(rs!Geburtstag) Then
    LogValidierungsfehler "Import", "Geburtstag", "Fehlerhafte Angabe: " & rs!Geburtstag
    GoTo Nächster
End If

Validierung ist Pflicht, wenn die Quelle unzuverlässig ist.

Variante 8: Benutzerfreundlich validieren

  • Kurz und konkret: „Bitte PLZ angeben.“
  • Im richtigen Moment: nicht erst beim Speichern
  • Mit Fokus: txtFeld.SetFocus
  • Ohne Abbruch: keine Endlosschleifen

Nicht: „Fehler 3022“
Sondern: „Diese Kundennummer gibt es schon.“

Best Practices

  • immer im Formular prüfen – nicht nur in Tabellen
  • alles kapseln, was mehrfach vorkommt
  • keine MessageBox-Orgie
  • Eingabefehler trennen von technischen Fehlern
  • Prüflogik und Anzeige sauber trennen

Variante 9: Gründliche E-Mail-Validierung mit RegExp

Access kann keine regulären Ausdrücke von Haus aus – aber mit dem VBScript.RegExp-Objekt geht’s.

Zuerst brauchst Du eine Referenz oder den späten Bindungsweg.

Beispiel mit Late Binding:

Public Function IstGueltigeEmailAdresse(email As String) As Boolean
    Dim regex As Object
    Set regex = CreateObject("VBScript.RegExp")

    regex.Pattern = "^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$"
    regex.IgnoreCase = True
    regex.Global = False

    IstGueltigeEmailAdresse = regex.Test(email)
End Function

Diese Prüfung ist schon recht gut – prüft:

  • gültige Zeichen vor dem @
  • keine Leerzeichen
  • Domain mit Punkt und mindestens 2 Buchstaben danach

Nicht perfekt laut RFC 5322 – aber in 99 % der Fälle völlig ausreichend.

Anwendung im Formular:

If Not IstGueltigeEmailAdresse(Me.txtEmail) Then
    MsgBox "Bitte gültige E-Mail-Adresse eingeben.", vbExclamation
    Cancel = True
    Me.txtEmail.SetFocus
End If

Hinweis: Für interne Domains ohne TLD musst Du ggf. die RegEx anpassen (\.{2,} → optional).

Fazit für Entwickler

Gute Validierung spart Dir Ärger.
Je früher Du prüfst, desto weniger Datenmüll musst Du nachher aufräumen.
Access gibt Dir alle Werkzeuge. Du musst sie nur sauber einsetzen.

Nach oben scrollen