Lebensdauer & Sichtbarkeit von Variablen

Wie lange eine Variable oder Konstante ihren Wert behält (ihre „Lebensdauer“), und wo sie überall „sichtbar“ ist, hängt davon ab, wo und wie sie deklariert wird. Innerhalb einer Prozedur ist es üblich und sinnvoll, gleich zu Beginn alle Deklarationen unterzubringen, auch wenn sie erst weiter hinten im Code benötigt werden. Damit sind sie innerhalb dieser Prozedur gültig. Deklarationen sind aber auch für ein ganzes Modul oder sogar für alle Module möglich.

Generell sollte man möglichst kleinteilig deklarieren, um auszuschließen, dass der Wert versehentlich von einer anderen Prozedur oder gar aus einem anderen Modul heraus verändert wird. Nebenbei kann so der gleiche Variablenname in einer anderen Prozedur in ganz anderem Zusammenhang verwendet werden. Diese Kleinteiligkeit nennt man Kapselung.

Modul1 (Code) Modul2 (Code)
Option Explicit

Private modulweit As Boolean
Public ueberall As Boolean


Sub
meineSub() Dim nurHier As Boolean nurHier = True modulweit = True ueberall = True End Sub
Option Explicit

Public Const MwSt = 0.19
Private Const Modul = "Modul2"


Sub VariablenTest() nurHier = True 'Fehler modulweit = True 'Fehler ueberall = True End Sub

Hier sind im Modul1 verschiedene Variablen deklariert: In der Sub MeineSub gibt es nurHier. Sie ist nur innerhalb dieser Sub verfügbar. Die Variable modulweit ist mit Private deklariert worden. Sie steht allen Prozeduren zur Verfügung, die sich im Modul1 befinden. Außerdem gibt es noch die Variable ueberall, die mit Public deklariert wurde und somit auch aus anderen Modulen her aufrufbar ist. Private und Public sind nur im Deklarationsbereich zulässig.

Im Modul2 sind im Deklarationsbereich noch zwei Konstanten deklariert. Für sie gilt das natürlich analog genauso.

Da die Sub meineSub innerhalb von Modul1 steht, kann sie alle Variablen von Modul1 nutzen. Anders bei der Sub variablenTest, die sich in einem anderen Modul befindet: Der Versuch, diese Sub auszuführen, würde einen Fehler verursachen, weil für VariablenTest weder nurHier noch modulweit sichtbar ist.

Würde man im obigen Code auf Option Explicit verzichten, bekäme man keine Fehlermeldung. Dann würden beim Aufruf von VariablenTest nämlich einfach innerhalb dieser Sub neue Variant-Variablen namens nurHier und modulweit deklariert, die nichts mit den Boolean-Variablen in Modul1 zu tun hätten! Hier zeigt sich die Nützlichkeit von Option Explicit, denn derartige Fehler später einmal aufzuspüren, wäre ausgesprochen schwierig und aufwendig.

Schauen wir uns nun im Direktbereich erst ueberall an, führen dann meineSub aus und schauen anschließend erneut nach ueberall:

Debug.Print ueberall
Falsch
meineSub
Debug.Print ueberall
Wahr

ueberall behält also seinen Wert („lebt weiter“), obwohl meineSub beendet ist. Will man sich dagegen eine Variable anzeigen lassen, die nicht mit Public deklariert wurde, bekommt man einen String der Länge 0 angezeigt - konkret würde VBA davon ausgehen, dass für das Debugfenster kein Option Explicit gilt, deswegen eine neue Variantvariable erzeugen und als Leerstring ausgeben. Unmittelbar nach der Ausgabe ist die Lebensdauer dieser Variable dann beendet:

Debug.Print modulweit

Debug.Print irgendwas

Für den Fall, dass der Wert einer Variablen nur in einer bestimmten Prozedur zur Verfügung stehen soll, allerdings beim nächsten Aufruf der Prozedur deren letzter Wert wiederverwendet werden soll, gibt es die Static−Anweisung:

Sub mehr()
    Static x As Long
    Dim y As Long
    
    x = x + 1
    y = y + 1
    Debug.Print "x: " & x & " y: " & y
End Sub

Obwohl x und y den gleichen Datentyp haben, wird x bei jedem Aufruf von mehr jeweils um 1 erhöht, y bekommt dagegen immer wieder aufs Neue 1 zugewiesen. x hat also eine längere Lebensdauer als y.

mehr
x: 1 y: 1
mehr
x: 2 y: 1
mehr
x: 3 y: 1

Übrigens werden wir in einem sehr viel späteren Kapitel noch sehen, dass es für Public-Variablen im Deklarationsbereich eine empfehlenswertere Alternative gibt. Hier wurde das nur erwähnt, weil es für das Verständnis von Lebensdauer und Sichtbarkeit wichtig ist.