Bedingte Kompilierung

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
KonstanteBeschreibung
VBA6älteres Office
VBA7Office ab Version 2010
Win32Office unterstützt mindestens 32 Bit
Win64Office 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: