Programmierung: Welche Best Practices gibt es für die Verwendung von VBA in Access?

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 Formulare
  • qryUmsaetze2024 für Abfragen
  • modTools für Module
  • btnSpeichern_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 Abfrage
  • lkp – Lookup-Tabelle (z. B. für Dropdowns)

Formulare und Berichte

  • frm – Formular (Form)
  • subfrm – Unterformular
  • rpt – Bericht (Report)

Steuerelemente (Controls)

  • txt – Textfeld
  • lbl – 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 – Standardmodul
  • bas – Basis-Modul (in alten Projekten oft verwendet)
  • cls – Klassenmodul

Datenbankobjekte (VBA intern)

  • rs – Recordset
  • db – Database
  • qdf – QueryDef
  • tdf – TableDef
  • fld – Field (Feldobjekt)
  • ctl – Control (Steuerelement allgemein)

Andere nützliche Kürzel

  • usr – Benutzerdefinierte Datenstruktur oder User
  • col – Collection
  • int, 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.

Kategorien:

Schlagwörter: