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.

Categories:

Tags:

No responses yet

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert