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 |
Option Explicit Public Const MwSt = 0.19 Private Const Modul = "Modul2" |
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.