Ziel: Fehler verstehen, reproduzieren, sauber beheben
Access schmeiĂt Dir gerne mal ein „Laufzeitfehler 13“ um die Ohren.
Oder: „Datensatz kann nicht gespeichert werden“.
Wenn Du wissen willst, was wirklich los ist – musst Du debuggen.
Nicht raten.
Variante 1: Fehlerprozedur zentral nutzen
Public Sub Fehlerbehandlung(prozedur As String, fehlerNr As Long, beschreibung As String)
MsgBox "Fehler in " & prozedur & vbCrLf & _
"Fehlernummer: " & fehlerNr & vbCrLf & _
"Beschreibung: " & beschreibung, vbCritical
End Sub
Dann in jedem Modul:
Sub Beispiel()
On Error GoTo Fehler
' ⊠dein Code âŠ
Exit Sub
Fehler:
Call Fehlerbehandlung("Beispiel", Err.Number, Err.Description)
End Sub
So erkennst Du, wo es knallt.
Variante 2: Debug.Print fĂŒr ZwischenstĂ€nde
Debug.Print "Aktueller Wert:", Me.ArtikelID, Me.Preis
Das landet im Direktfenster (Strg+G) – ohne MessageBox.
Hilft bei Schleifen, Bedingungen, SQL-AusdrĂŒcken.
Variante 3: SQL-Strings prĂŒfen vor AusfĂŒhrung
Dim sql As String
sql = "SELECT * FROM tblKunde WHERE Name = '" & Me.txtName & "'"
Debug.Print sql
Ergebnis im Direktfenster copy-pasten und im Abfrageeditor ausfĂŒhren.
So findest Du Tippfehler, fehlende Hochkommas oder ungĂŒltige Datumsformate.
Variante 4: On Error Resume Next – nur gezielt
On Error Resume Next
Kill "C:\Temp\datei.csv"
If Err.Number <> 0 Then
Debug.Print "Löschen fehlgeschlagen:", Err.Description
Err.Clear
End If
Nie als Standard einsetzen. Nur da, wo Du Fehler erwartest.
Variante 5: Abfragen mit Parametern testen
Kein DLookup("*", "tblKunde", "ID=" & Me.ID)
Sondern:
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("SELECT * FROM tblKunde WHERE ID=" & Me.ID)
Dann Zeile fĂŒr Zeile prĂŒfen, was drin ist.
Variante 6: Events im Formular checken
Formulare reagieren auf:
BeforeUpdateAfterUpdateOnCurrentOnDirty
Wenn Du nicht sicher bist, wann was lÀuft:
Private Sub Form_Current()
Debug.Print "Form_Current: " & Now()
End Sub
Oder bei Kombifeld:
Private Sub cboKunde_AfterUpdate()
Debug.Print "Kunde geÀndert: " & Me.cboKunde
End Sub
Variante 7: Application.Echo zur Fehleranalyse
Application.Echo False
' Aktionen
Application.Echo True
Verhindert Flackern und stört Debuggen weniger.
Achtung: Immer True am Ende – sonst bleibt Access „blind“.
Variante 8: Datenbankfenster und Systemobjekte anzeigen
- Systemtabellen einblenden â Optionen â Navigationsbereich
- z. B.
MSysObjects,MSysRelationships
Hilft beim PrĂŒfen: wurde Tabelle wirklich gelöscht, verknĂŒpft, aktualisiert?
Variante 9: Breakpoints und „Schrittweise ausfĂŒhren“
- Haltepunkt setzen mit
F9 - Mit
F8Schritt fĂŒr Schritt durch Code - Werte mit Maus anzeigen
- Watch-Fenster nutzen fĂŒr komplexe Bedingungen
Funktioniert zuverlĂ€ssig – solange kein OnError das Ganze unterdrĂŒckt.
Variante 10: Protokolltabelle fĂŒr Fehler anlegen
Public Sub LogFehler(modul As String, meldung As String)
CurrentDb.Execute "INSERT INTO tblFehlerLog (Zeitpunkt, Modul, Meldung) VALUES (Now(), '" & modul & "', '" & Replace(meldung, "'", "''") & "')"
End Sub
In der Fehlerbehandlung:
LogFehler "frmKundenSpeichern", Err.Number & ": " & Err.Description
Hilft Dir bei produktiven Systemen mit mehreren Usern.
Best Practices
- kein Code ohne
On Error - nie
Resume Nextals globale Lösung - jede SQL-Zeile vor dem AusfĂŒhren loggen oder anzeigen
- keine MessageBox in Schleifen
- Direktfenster regelmĂ€Ăig aufrĂ€umen
- immer mit festen Prozedurnamen arbeiten („ModulX“)
- fĂŒr wiederkehrende Fehler (z. B. „Datensatz gesperrt“) gezielte PrĂŒfung einbauen
Fazit fĂŒr Entwickler
Fehler sind nicht schlimm – solange Du weiĂt, wo sie herkommen.
Access ist alt, aber mit Debug.Print, On Error und etwas Struktur kannst Du alles nachvollziehen.