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.

