Mit bedingter Kompilierung kann ein beliebig großer Codeblock deaktiviert werden. So kann man verschiedene Lösungen miteinander vergleichen, oder aber selbst fehlerhafte Codezeilen zunächst einmal im Code belassen. Wie wir in späteren Kapiteln sehen werden, ist bedingte Kompilierung aber auch in ganz anderen Zusammenhängen nützlich.
Die bedingte Kompilierung ist ein Spezialfall der Verzeigung mit If..Then, nämlich mit vorangestelltem „#“. Bei dem Vergleichswert, der darin abgefragt wird, muss es sich zwingend eine Konstante handeln, die ebenfalls mit vorangestelltem „#“ deklariert werden muss. Normale Konstanten oder Variablen sowie das Ergebnis einer Berechnung können nicht verwendet werden.
Sub performance() #Const Variante = 1 Dim Start As Single, i As Long Start = Timer #If Variante = 1 Then For i = 1 To 10000000 Next #Else Do i = i + 1 Loop Until i = 10000000 Diese Zeile verursacht einen Fehler. Oder doch nicht? #End If Debug.Print Timer - Start End Sub
In der obigen Prozedur wird eine Schleife 10 Millionen Mal durchlaufen.
Mit Hilfe einer bedingten Kompilierung kann nun getestet werden, ob dazu eine
For
- oder Do
-Schleife
schneller ist. Der Startzeitpunkt der Prozedur wird mit der VBA-internen Funktion
Timer ermittelt, die die Anzahl der seit
Mitternacht vergangenen Sekunden zurückgibt. Für den eigentlichen Test muss man
nun die Funktion einmal aufrufen, dann den Wert der Konstanden Variante
ändern und die Funktion nochmals aufrufen.
In der Prozedur ist außerdem auch noch eine fehlerhafte Programmzeile enthalten. Solange der Programmteil, in dem diese Zeile enthalten ist, mittels bedingter Kompilierung nicht verwendet wird, funktioniert der Code dennoch problemlos. Ansonsten muss man diesen Fehler natürlich beheben, z. B., indem man die Zeile löscht oder auskommentiert.
VBA bringt von Haus aus schon eigene Konstanten für die bedingte Kompilierung mit, die natürlich nicht nochmals deklariert werden müssen:
Kompilerkonstanten | |
---|---|
Konstante | Beschreibung |
VBA6 | älteres Office |
VBA7 | Office ab Version 2010 |
Win32 | Office unterstützt mindestens 32 Bit |
Win64 | Office unterstützt 64 Bit |
Win32
gibt auch auf 64-Bit Systemen True
zurück,
damit auch uralter Code, der dereinst zur Unterscheidung zwischen 16- und 32-Bit
notwendig war, noch heute irgendwie funktioniert. Daher ist es heute empfehlenswert,
nicht Win32
für die Verzweigung abzufragen, sondern stattdessen
immer die höhere Version als Bedingung zu nutzen.
Im Gegensatz zum „normalen“ If
kann
#If
auch im Deklarationsbereich
eines Moduls verwendet werden.
#If Win64 Then Public i As LongLong #Else Public i As Long #End If
Ob eine Kompilerkonstante im Deklarationsbereich oder in einer Prozedur deklariert
wird, ist unwichtig - sie ist stets im gesamten Modul sichtbar, also wie
Private
. Um sie projektweit
sichtbar zu machen, muss man sie im Menü unter Extras/Eigenschaften
im Feld Argumente für bedingte Kompilierung
eintragen. Mehrere Konstanten
werden dort mit Doppelpunkten getrennt.
VBAProject - Projekteigenschaften | |
---|---|
Projektname: |
|
Projektbeschreibung: |
|
Name der Hilfedatei: |
Kontext-ID für Projekthilfe: |
Argumente für bedingte Kompilierung: |
|
|
|