🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Const in Excel — Magische Zahlen benennen (und warum der Wert nicht driften kann)

|

VBA Const in Excel — Magische Zahlen benennen (und warum der Wert nicht driften kann)

TL;DRConst VAT_RATE As Double = 0.19 gibt einem festen Wert einen Namen, der zur Compilezeit verankert ist. Während eine Variable eine Box ist, die Sie neu befüllen können, ist eine Konstante ein aufgemaltes Etikett — überall lesbar, während der Makro-Laufzeit nirgends übermalbar. Diese Unveränderlichkeit ist der ganze Sinn: Sie macht aus einer über acht Formeln verstreuten magischen Zahl eine einzige verbindliche Quelle. Der Versuch, eine Const neu zuzuweisen, ist ein Compilerfehler („Zuweisung zu Konstante nicht zulässig“) — und dieser Fehler ist das Feature, nicht eine Einschränkung. Für eine Familie verwandter fester Werte (Status, Spaltennummern) nutzen Sie ein Enum statt vieler einzelner Consts.

Const VAT_RATE   As Double = 0.19          ' ein Ort, eine Wahrheit
Const MAX_ROWS   As Long = 10000
Const REPORT_TAB As String = "Summary"

Sub ShowRate()
    Debug.Print "MwSt. beträgt " & VAT_RATE * 100 & "%"   ' -> MwSt. beträgt 19%
End Sub

Jedes Makro steckt voller literaler Werte: ein Steuersatz, eine Kopfzeilennummer, ein Blattname, ein Schwellenwert. Inline getippt, ist jeder davon eine magische Zahl — ein nacktes 0.19 oder 7, dessen Bedeutung Sie raten müssen und dessen Wert Sie aufspüren müssen, wenn er sich ändert. Const ist die Kur, und es ist eines der billigsten Qualitäts-Upgrades, die Sie an einem Makro vornehmen können.

Was Sie lernen

  • Warum magische Zahlen eine Wartungsfalle sind und wie Const das an einer einzigen Stelle behebt
  • Warum das Neuzuweisen einer Const ein Compilerfehler ist — und warum genau das gewollt ist
  • Die Compilezeit-Regel: eine Const darf ein Literal sein, kein Funktionsaufruf und kein Zellwert
  • Public Const für Werte, die Ihr ganzes Projekt teilt
  • Wann Sie von vielen Consts auf ein einzelnes Enum umsteigen

Das mentale Modell: eine Konstante ist ein aufgemaltes Etikett, keine Box, die Sie neu befüllen

Eine Variable und eine Konstante sehen ähnlich aus, verhalten sich aber gegensätzlich. Eine Variable ist eine Box: Sie legen einen Wert hinein und können ihn später gegen einen anderen tauschen. Eine Konstante ist ein auf einen Wert gemaltes Etikett — im Moment des Kompilierens. Jeder kann das Etikett von überall lesen, wo es im Gültigkeitsbereich liegt — aber nichts kann es übermalen, während der Code läuft. Der Wert ist eingefroren.

Dieses Eingefrorensein ist keine Einschränkung, die man umgehen müsste; es ist die Garantie, die Sie kaufen. Wenn Sie Const VAT_RATE = 0.19 schreiben, sagen Sie sowohl dem Compiler als auch dem nächsten Leser: Diese Zahl hat eine Bedeutung, sie lebt an einer Stelle, und sie ändert sich nicht heimlich unter Ihren Händen. Alles Gute an Konstanten fließt aus diesem Versprechen.

Die Regel, die sich bezahlt macht: magische Zahlen driften, Konstanten nicht

Hier ist das Problem, das Const löst. Angenommen, 0.2 — ein MwSt.-Satz — ist direkt in acht verschiedene Formeln über Ihre Makros hinweg getippt:

' Magische Zahl 0.2 überall verstreut — eine Satzänderung heißt, alle acht aufzuspüren
gross = net * 1.2
vat   = net * 0.2
' ...sechs weitere Stellen, jede mit einem nackten 0.2...

Jetzt ändert sich der Satz auf 0.19. Sie müssen jede einzelne finden und bearbeiten. Übersehen Sie nur eine Stelle, bekommen Sie eine stille falsche Summe — kein Fehler, nur Zahlen, die nicht aufgehen, in einem Bericht und im anderen nicht. Und ein Leser sechs Monate später hat keine Ahnung, ob dieses 0.2 MwSt., ein Rabatt oder eine Provision ist.

Eine Konstante behebt das alles:

Const VAT_RATE As Double = 0.19    ' hier einmal ändern, und jede Stelle aktualisiert sich

gross = net * (1 + VAT_RATE)
vat   = net * VAT_RATE

Der Wert lebt an genau einer Stelle, der Name dokumentiert seine Bedeutung, und eine Satzänderung ist eine Ein-Zeilen-Bearbeitung, die nicht halb erledigt werden kann. Jedes Literal, das mehr als einmal vorkommt oder dessen Bedeutung sich nicht aus dem Kontext ergibt, sollte eine Const sein.

Die Regel, die eigentlich ein Feature ist: Sie können einer Const nichts zuweisen

Versuchen Sie, eine Konstante zu ändern, weigert sich VBA — zur Compilezeit, noch bevor das Makro läuft:

Const TAX As Double = 0.2

Sub Oops()
    TAX = 0.25       ' Compilerfehler: Zuweisung zu Konstante nicht zulässig
End Sub

Anfänger lesen diesen Fehler manchmal so, als sei VBA zickig. Es ist das Gegenteil: Der Compiler garantiert, dass sich der Wert nie ändert — genau der Grund, aus dem Sie eine Konstante deklariert haben. Ertappen Sie sich beim Wunsch, sie neu zuzuweisen, dann war es nie wirklich eine Konstante — es ist eine Variable, die sich zur Laufzeit ändert, also deklarieren Sie sie mit Dim. Die Unterscheidung ist die ganze Entscheidung: Ändert sich dieser Wert, während das Makro läuft? Wenn ja, Dim. Wenn nein, Const.

Die Regel, die überrascht: Const wird zur Compilezeit ausgewertet

Weil das Etikett beim Kompilieren aufgemalt wird, kann eine Konstante nur auf etwas gesetzt werden, das der Compiler bereits kennt: ein Literal oder einen Ausdruck aus anderen Konstanten. Sie kann kein Funktionsaufruf, kein Blattwert und nichts sein, das erst während der Makro-Laufzeit berechnet wird.

' FUNKTIONIERT — Literal oder Ausdruck aus Literalen/anderen Konstanten
Const PI       As Double = 3.14159
Const TWO_PI   As Double = 2 * PI
Const HEADER   As String = "Report — " & "2026"

' SCHLÄGT FEHL — braucht Laufzeit-Auswertung, muss also eine Variable sein
Const TODAY    As Date = Date          ' Compilerfehler: Konstantenausdruck erforderlich
Const RATE     As Double = Range("A1").Value   ' Compilerfehler

Lässt sich der Wert erst zur Laufzeit des Makros bestimmen — das heutige Datum, der aktuelle Inhalt einer Zelle, das Ergebnis einer Funktion —, gehört er in eine Dim-Variable, die Sie zur Laufzeit zuweisen, nicht in eine Const.

Sichtbarkeit: lokale Const vs. Public Const

Eine Const folgt denselben Sichtbarkeitsregeln wie ein Dim. Innerhalb einer Sub geschrieben, ist sie lokal zu dieser Prozedur. Am Anfang eines Moduls mit Public geschrieben, wird sie zu einer projektweiten Konstante, die jedes Modul lesen kann:

' In einem Modul namens Config, oberhalb jeder Prozedur:
Public Const APP_NAME    As String = "Monthly Close"
Public Const DATA_SHEET  As String = "Raw"
Public Const HEADER_ROW  As Long = 1

Das Idiom, das skaliert, ist ein einziges Config-Modul, das jede projektweite Konstante hält — Blattnamen, Schwellenwerte, den App-Titel —, sodass es genau eine Stelle gibt, an der man nachsieht, wenn sich etwas ändern muss. Halten Sie prozedurspezifische Konstanten lokal; befördern Sie nur die, die wirklich geteilt werden.

Wenn ein Wert nicht reicht: nutzen Sie Enum für eine Familie

Wenn Sie eine Gruppe verwandter Konstanten haben — Bestellstatus, Spaltenpositionen, Berichtstypen —, funktioniert ein Haufen einzelner Consts, liest sich aber schlecht. Ein Enum benennt sie als Menge, gruppiert sie unter einem Typ und gibt Ihnen IntelliSense und eine leichte Typprüfung:

Enum OrderStatus
    Pending = 1
    Paid = 2
    Shipped = 3
    Cancelled = 4
End Enum

Sub Demo()
    Dim s As OrderStatus
    s = Paid
    If s = Cancelled Then Exit Sub
End Sub

Die Faustregel: Const für einen einzelnen Wert; Enum für eine Familie verwandter Werte, die zusammengehören. Ein Enum signalisiert auch Absicht — ein Parameter vom Typ As OrderStatus sagt dem Leser (und dem Editor) genau, welche Werte zulässig sind.

Wie ExcelMaster hilft

Konstanten, Sichtbarkeitsdisziplin und Enums sind die Gewohnheiten, die ein wachsendes Makro wartbar halten — und sie sind Aufwand, den Sie in jedem Projekt mittragen, lange bevor Sie zu der Logik kommen, die Sie eigentlich interessiert.

ExcelMaster lässt Sie die Regel benennen, statt die Verkabelung zu legen: „Wende 19 % MwSt. auf Spalte D an, markiere alles im Status Cancelled, schreibe die Summe ins Blatt Summary.“ Es verwandelt das in funktionierende Logik mit dem Satz und den Statuswerten an einer Stelle, sodass eine Änderung eine Änderung an der Beschreibung ist, keine Jagd durch acht Formeln. Sie deklarieren weiterhin Consts in handgeschriebenen Makros, wo Sie die Kontrolle wollen; für die alltägliche Aufgabe schlägt das Beschreiben der Regel das Pflegen der magischen Zahlen dahinter.

Häufig gestellte Fragen

Was ist eine Konstante in VBA?

Eine Konstante ist ein benannter Wert, der zur Compilezeit festgelegt ist und sich nicht ändern kann, während das Makro läuft. Sie deklarieren eine mit Const, z. B. Const VAT_RATE As Double = 0.19. Sie ersetzt eine verstreute „magische Zahl“ durch eine einzige benannte Quelle, sodass der Wert an einer Stelle lebt und seine Bedeutung durch seinen Namen dokumentiert ist.

Was ist der Unterschied zwischen Const und Dim?

Dim deklariert eine Variable — eine Box, deren Wert Sie zur Laufzeit ändern können. Const deklariert eine Konstante — einen zur Compilezeit verankerten Wert, der nicht neu zugewiesen werden kann. Nutzen Sie Const für alles, das sich während der Makro-Laufzeit nie ändert (ein Satz, ein Blattname, ein Schwellenwert), und Dim für alles, das sich ändert.

Kann ich eine Const zur Laufzeit ändern?

Nein. Einer Konstante einen neuen Wert zuzuweisen ist ein Compilerfehler („Zuweisung zu Konstante nicht zulässig“), und diese Garantie ist der Grund, eine zu verwenden. Muss sich ein Wert ändern, während das Makro läuft, ist er keine Konstante — deklarieren Sie ihn stattdessen mit Dim als Variable.

Warum schlägt Const x = Range("A1").Value fehl?

Weil eine Const zur Compilezeit ausgewertet wird, kann sie nur auf ein Literal oder einen Ausdruck aus anderen Konstanten gesetzt werden — nie auf etwas zur Laufzeit Berechnetes wie einen Zellwert, ein Funktionsergebnis oder Date. Für solche Fälle nutzen Sie eine Dim-Variable, die Sie zur Laufzeit des Makros zuweisen.

Was ist Enum in VBA und wann sollte ich es statt Const verwenden?

Ein Enum definiert eine Familie verwandter benannter Konstanten unter einem Typ, z. B. Bestellstatus oder Spaltennummern. Nutzen Sie mehrere Consts für einzelne Werte, aber greifen Sie zu einem Enum, wenn die Werte als Menge zusammengehören — es gruppiert sie, ermöglicht IntelliSense und lässt Sie einen Parameter mit As und diesem Enum typisieren, um zu dokumentieren, welche Werte gültig sind.

Getestet in

Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 31.07.2026.

Verwandte Anleitungen: VBA Dim · VBA Datentypen · VBA Sub · VBA Function · VBA If Then Else