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):
frmKunden
für FormulareqryUmsaetze2024
für AbfragenmodTools
für ModulebtnSpeichern_Click
fü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.
No responses yet