VBA in Access ist kein Hexenwerk.
Aber zwischen „es läuft irgendwie“ und „das Ding hält zehn Jahre durch“ liegen Welten.
Ich zeig Dir hier meine erprobten Best Practices für Access-VBA – aus der Praxis für die Praxis.
Nicht für akademische Lehrbücher, sondern für Projekte, die bei KMU im Alltag laufen müssen.
1. Trenn Logik von Oberfläche
Wenn Du alles in Formular-Ereignisse schreibst, bist Du verloren, sobald sich etwas ändert.
Pack Logik in Module.
Beispiel:
' Modul: modRechnungen
Public Sub RechnungAlsBezahltMarkieren(RechnungsID As Long)
CurrentDb.Execute "UPDATE tblRechnungen SET Status='Bezahlt' WHERE ID=" & RechnungsID, dbFailOnError
End Sub
Im Formular:
Private Sub btnBezahlt_Click()
RechnungAlsBezahltMarkieren Me!RechnungsID
Me.Requery
End Sub
So kannst Du’s auch von anderen Stellen aufrufen – z. B. aus einem Bericht oder einem Massenimport.
2. Schreibe eigene Fehlerbehandlung – immer
Nicht nur „On Error Resume Next“. Sondern richtig.
Public Sub Beispiel()
On Error GoTo Fehler
' Dein Code hier
Dim x As Integer
x = 1 / 0
Exit Sub
Fehler:
MsgBox "Fehler: " & Err.Description, vbCritical, "Modul XY"
' Logging z. B. in Tabelle schreiben
End Sub
Noch besser: LogFehler Err aufrufen, zentral in einer Funktion.
3. Verwende Konstanten statt Hardcoding
Const STATUS_NEU = "Neu"
Const STATUS_GESPERRT = "Gesperrt"
Dann schreibst Du:
If Me.Status = STATUS_GESPERRT Then ...
Und nicht überall „Gesperrt“ als Literal.
Klingt klein. Spart viel.
4. Nutze Typisierung und Option Explicit
Ganz oben in jedem Modul:
Option Explicit
Dann musst Du alle Variablen deklarieren.
Klingt nervig – rettet Dich aber bei Tippfehlern.
Immer:
Dim i As Long
Nie:
Dim i
Sonst ist i vom Typ Variant. Und das ist Mist für Performance und Fehlerkontrolle.
5. Datenbankobjekte sauber schließen
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("SELECT * FROM tblKunden")
Do While Not rs.EOF
' Irgendwas tun
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
Wenn Du das vergisst, wird Access irgendwann instabil.
Oder bleibt im exklusiven Modus hängen.
6. Baue Helferfunktionen
Statt alles jedes Mal neu zu schreiben:
Public Function IstLeer(text As Variant) As Boolean
IstLeer = (Nz(Trim(text), "") = "")
End Function
Dann:
If IstLeer(Me.Email) Then ...
Schneller, sauberer, wiederverwendbar.
7. Vermeide redundanten Code durch Schleifen
Statt 10 Felder händisch zu leeren:
Dim ctl As Control
For Each ctl In Me.Controls
If ctl.ControlType = acTextBox Then ctl.Value = Null
Next
Oder alle Felder readonly setzen:
If ctl.Tag = "nurlesen" Then ctl.Enabled = False
Tag-Feld als Metadaten-Trick – klappt gut bei vielen Steuerelementen.
8. Kommentare ja – aber nur da, wo’s Sinn ergibt
Nicht sowas:
x = x + 1 ' x um 1 erhöhen
Sondern:
' Übergibt die Rechnung an den Steuerberater
SendeRechnungAnExtern(RechnungsID)
Und bei längeren Funktionen: Zweck ganz oben kommentieren.
9. Setze Dir Namenskonventionen
Beispiele (nicht in Stein gemeißelt – aber konsistent):
frmKundenfür FormulareqryUmsaetze2024für AbfragenmodToolsfür ModulebtnSpeichern_Clickfür Buttons
Und bei Feldern: txtName, cboOrt, chkAktiv, lblFehler.
10. Performance beachten
- Abfragen vorbereiten – kein
SELECT * - Nur sichtbare Felder laden
- Endlosformulare begrenzen (
TOP 100) - Steuerelemente nicht ständig neu setzen
Und: Nicht alle Events triggern, wenn sich nichts geändert hat.
If Me.txtWert <> NeuerWert Then
Me.txtWert = NeuerWert
End If
Fazit
VBA in Access ist mächtig – wenn Du sauber arbeitest.
Das heißt:
- Kapseln statt kopieren
- Fehler behandeln
- Module statt Formular-Logik
- Helfer bauen, Schleifen nutzen
- Performance im Blick behalten
Dann wird aus einem Access-Projekt kein Flickenteppich, sondern eine wartbare Anwendung.
Es gibt in der Access-Welt keine offiziell von Microsoft verpflichtenden Namenskonventionen, aber es hat sich über die Jahre ein quasi-Standard durchgesetzt: Lesbare, strukturierte Präfixe nach dem „Leszynski/Reddick Style Guide“ – angepasst an VBA und Access.
Warum das sinnvoll ist?
- Du erkennst am Namen, was ein Objekt ist (
frm,qry,tbl) - Du vermeidest Namenskonflikte mit reservierten Wörtern (z. B.
Date,Name) - Du bekommst eine durchgängige Struktur, die sich im Team besser warten lässt
Die 30 häufigsten Präfixe in Access-Projekten (nach Typ)
Tabellen und Abfragen
tbl– Tabelle (physisch)qry– Abfrage (Query)tmp– temporäre Tabelle oder Abfragelkp– Lookup-Tabelle (z. B. für Dropdowns)
Formulare und Berichte
frm– Formular (Form)subfrm– Unterformularrpt– Bericht (Report)
Steuerelemente (Controls)
txt– Textfeldlbl– Bezeichnungsfeld (Label)cbo– Kombinationsfeld (ComboBox)lst– Listenfeld (ListBox)chk– Kontrollkästchen (Checkbox)opt– Optionsfeld (OptionButton)cmd– Befehlsschaltfläche (CommandButton)img– Bild (Image)tab– Registerkarten-Steuerelement (TabControl)fra– Rahmen (Frame)
Module und Code
mod– Standardmodulbas– Basis-Modul (in alten Projekten oft verwendet)cls– Klassenmodul
Datenbankobjekte (VBA intern)
rs– Recordsetdb– Databaseqdf– QueryDeftdf– TableDeffld– Field (Feldobjekt)ctl– Control (Steuerelement allgemein)
Andere nützliche Kürzel
usr– Benutzerdefinierte Datenstruktur oder Usercol– Collectionint,lng,str,bln,dtm– Datentyppräfixe (z. B.lngKundenID,blnAktiv)
Beispiel für einheitliche Benennung
Dim lngKundenID As Long
Dim strNachname As String
Dim rsKunden As DAO.Recordset
Set rsKunden = CurrentDb.OpenRecordset("qryAktiveKunden")
If rsKunden!blnGesperrt = False Then
frmKundendetails.txtName = rsKunden!strNachname
End If
Es geht nicht um Pedanterie – es geht um Wartbarkeit.
Gerade bei Access-Projekten in KMU, wo nach drei Jahren wieder jemand ran muss, sind klare Namensregeln Gold wert.