Lektionen/Grundlagen

Konstanten & Enums

Einsteiger8 Min. Lesezeit

„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 Const funktioniert 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:

KonstanteBedeutung
vbCrLfZeilenumbruch (Wagenrücklauf + Zeilenvorschub)
vbTabTabulatorzeichen
vbNullStringleerer String ""
vbYes / vbNoRückgabewerte einer Ja/Nein-Abfrage
vbYesNozeigt Ja- und Nein-Button in MsgBox
vbQuestionFragezeichen-Symbol in MsgBox
vbCriticalFehler-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 FehlerVersndet wird als undefiniert gemeldet (bei Option Explicit), 3 dagegen 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 du Const. Und: Ein Enum-Parameter erzwingt technisch nicht, dass wirklich nur gültige Werte kommen; jemand könnte auch SetzeStatus 4711, 99 übergeben. Der Nutzen liegt in Lesbarkeit und IntelliSense, nicht in harter Validierung.

Zusammengefasst

  • Const Name As Typ = Wert benennt feste Werte; ein Überschreiben wird gar nicht kompiliert.
  • Public Const oben in einem Standardmodul gilt projektweit — ideal für zentrale Einstellungen.
  • Eingebaute Konstanten wie vbCrLf, vbYesNo oder vbYes statt der dahinterliegenden Zahlen verwenden.
  • Mit Enum bü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.
Nächste Lektion
Zahlen formatieren & runden