„Magic Numbers" sind Zahlen oder Texte, die ohne Erklärung mitten im Code stehen
— if status = 3 sagt niemandem, was 3 bedeutet. Konstanten und Enums geben
solchen Werten einen Namen. Dein Code wird lesbar, und Tippfehler fallen sofort
auf.
Const — Werte, die sich nie ändern
Mit Const deklarierst du einen benannten Wert, der zur Entwicklungszeit
feststeht und sich nicht überschreiben lässt. Der Typ wird meist automatisch
erkannt, du kannst ihn aber mit As festlegen:
Option Explicit
Public Sub Rechnung()
Const MWST As Double = 0.19
Const WAEHRUNG As String = "EUR"
Dim netto As Currency
netto = 100
Debug.Print netto * (1 + MWST) & " " & WAEHRUNG ' 119 EUR
End Sub
Ein Zuweisungsversuch an eine Konstante wird gar nicht erst kompiliert — VBA meldet einen Fehler. Genau das ist der Sinn: Der Wert soll fest sein.
Public Const — projektweit gültig
Steht Const in einer Prozedur, gilt es nur dort. Für Werte, die du überall
brauchst, deklarierst du sie mit Public Const oben in einem Standardmodul,
vor der ersten Prozedur:
' ganz oben in einem Modul, z. B. "modKonstanten"
Option Explicit
Public Const FIRMA As String = "Ously Games GmbH"
Public Const MAX_VERSUCHE As Long = 3
Public Const DB_PFAD As String = "C:\Daten\firma.accdb"
Diese Konstanten kannst du dann aus jedem Modul, jeder Form und jedem Bericht
verwenden. Ideal für zentrale Einstellungen, die an genau einer Stelle stehen —
änderst du MAX_VERSUCHE, wirkt das überall.
Public Constfunktioniert nur in Standardmodulen, nicht in Klassen- oder Formularmodulen. Dort ist eine Konstante immer modulprivat. Sammle deine globalen Konstanten deshalb in einem eigenen Standardmodul.
Eingebaute Konstanten
VBA und Access bringen viele fertige Konstanten mit. Du erkennst sie am Präfix
vb (VBA) oder ac (Access). Die brauchst du ständig — vor allem bei Text und
MsgBox:
| Konstante | Bedeutung |
|---|---|
vbCrLf | Zeilenumbruch (Wagenrücklauf + Zeilenvorschub) |
vbTab | Tabulatorzeichen |
vbNullString | leerer String "" |
vbYes / vbNo | Rückgabewerte einer Ja/Nein-Abfrage |
vbYesNo | zeigt Ja- und Nein-Button in MsgBox |
vbQuestion | Fragezeichen-Symbol in MsgBox |
vbCritical | Fehler-Symbol in MsgBox |
Dim antwort As VbMsgBoxResult
antwort = MsgBox("Datensatz wirklich löschen?" & vbCrLf & _
"Das kann nicht rückgängig gemacht werden.", _
vbYesNo + vbQuestion, "Löschen")
If antwort = vbYes Then
Debug.Print "Es wird gelöscht"
End If
Nutze diese Konstanten statt der dahinterliegenden Zahlen. vbYes ist 6 — aber
If antwort = 6 würde niemand verstehen, und du müsstest die Zahl nachschlagen.
Enum — eigene Aufzählungen
Ein Enum (Enumeration) ist eine Gruppe zusammengehöriger, benannter
Ganzzahl-Konstanten. Du deklarierst ihn oben im Modul. Damit bündelst du z. B.
alle möglichen Zustände an einer Stelle:
Public Enum AuftragStatus
Offen = 1
InBearbeitung = 2
Versendet = 3
Storniert = 4
End Enum
Gibst du keine Werte an, beginnt VBA bei 0 und zählt hoch. Es ist aber sauberer,
die Werte explizit hinzuschreiben — dann weißt du genau, welche Zahl in der
Datenbank landet.
Enum als Parameter für lesbaren Code
Der große Gewinn: Du kannst den Enum-Typ als Parametertyp verwenden. Beim Aufruf schlägt der VBA-Editor dir dann die gültigen Werte per IntelliSense vor:
Public Enum AuftragStatus
Offen = 1
InBearbeitung = 2
Versendet = 3
Storniert = 4
End Enum
Public Sub SetzeStatus(auftragNr As Long, status As AuftragStatus)
Dim text As String
Select Case status
Case Offen: text = "Offen"
Case InBearbeitung: text = "In Bearbeitung"
Case Versendet: text = "Versendet"
Case Storniert: text = "Storniert"
End Select
Debug.Print "Auftrag " & auftragNr & ": " & text
End Sub
Public Sub Aufruf()
' Beim Tippen von "AuftragStatus." erscheinen alle Werte:
SetzeStatus 4711, AuftragStatus.Versendet
End Sub
SetzeStatus 4711, AuftragStatus.Versendet liest sich fast wie ein Satz.
Vergleich das mit SetzeStatus 4711, 3 — ohne den Enum müsstest du raten, was
3 bedeutet.
Vorteile gegenüber „Magic Numbers"
Stell die beiden Varianten direkt nebeneinander:
' Ohne Enum: Was ist 3? Was ist 4?
If auftrag.status = 3 Then auftrag.status = 4
' Mit Enum: sofort verständlich
If auftrag.status = Versendet Then auftrag.status = Storniert
Was du durch Konstanten und Enums gewinnst:
- Lesbarkeit — der Name erklärt den Wert, kein Kommentar nötig.
- Weniger Fehler —
Versndetwird als undefiniert gemeldet (beiOption Explicit),3dagegen nie. Der Compiler prüft mit. - Zentrale Änderung — musst du den Wert anpassen, änderst du ihn an genau einer Stelle.
- IntelliSense — der Editor bietet dir die gültigen Werte an, du musst nichts auswendig wissen.
Enums sind immer ganzzahlig (
Long). Für Kommazahlen oder Texte gibt es keine Enums — dafür nimmst duConst. Und: Ein Enum-Parameter erzwingt technisch nicht, dass wirklich nur gültige Werte kommen; jemand könnte auchSetzeStatus 4711, 99übergeben. Der Nutzen liegt in Lesbarkeit und IntelliSense, nicht in harter Validierung.
Zusammengefasst
Const Name As Typ = Wertbenennt feste Werte; ein Überschreiben wird gar nicht kompiliert.Public Constoben in einem Standardmodul gilt projektweit — ideal für zentrale Einstellungen.- Eingebaute Konstanten wie
vbCrLf,vbYesNoodervbYesstatt der dahinterliegenden Zahlen verwenden. - Mit
Enumbündelst du zusammengehörige Ganzzahl-Werte und nutzt sie als Parametertyp — mit IntelliSense-Unterstützung. - Beides ersetzt „Magic Numbers" durch sprechende Namen: lesbarer Code, weniger Tippfehler, Änderungen an einer Stelle.