Möchtest Du den gesamten Artikel lesen? Und vielleicht sogar den Artikel im PDF-Format und die Beispieldateien herunterladen? Dann hole Dir den Artikel gleich hier - völlig kostenlos!
In VBA-Projekten kann es vorkommen, dass Anweisungen nur in bestimmten Situationen kompiliert werden sollen. Das bekannteste Beispiel sind die Deklarationen von API-Funktionen, die je nach VBA-Version mal in der 32-Bit- und mal in der 64-Bit-Variante bereitgestellt werden sollen. Da die 64-Bit-Version bei Verwendung von 32-Bit-Access unter Umständen Datentypen mit sich bringt, die es in der 32-Bit-Version nicht gibt, würde dies beim Kompilieren zu Fehlern führen. Daher gibt es die sogenannte bedingte Kompilierung, bei der man mit auf einer bestimmten Art formatierten If…Then-Bedingungen dafür sorgen kann, dass nur die für die aktuelle Version relevanten Codezeilen kompiliert werden können. In diesem Artikel zeigen wir, wie die bedingte Kompilierung funktioniert. Außerdem stellen wir ein weiteres Beispiel vor, in dem wir entweder die Early Binding- oder die Late Binding-Verwendung von Variablen nutzen wollen – abhängig von einer zur Laufzeit gesetzten Bedingung.
Bedingte Kompilierung
Die bedingte Kompilierung arbeitet mit If…Then-Bedingungen, die mit einem vorangestellten Raute-Zeichen angelegt werden:
#If VBA7 Then ''API-Deklarationen für VBA7 #Else ''API-Deklarationen für ältere VBA-Version #End If
Hier haben wir bereits die erste von einigen wenigen eingebauten Kompilierungskonstanten verwendet, nämlich VBA7. Diese hat den Wert True, wenn VBA in der Version 7 verwendet wird. Den Wert dieser Konstanten können wir nur in einer mit dem Raute-Zeichen beginnenden Zeile auslesen, sie kann nicht einfach mit Debug.Print ermittelt werden. Die folgende Anweisung liefert kein Ergebnis:
Debug.Print VBA7
Wir können aber eine Prozedur schreiben, in der wir per #If…#Then-Bedingung prüfen, ob VBA7 den Wert True oder False hat:
Public Sub IsVBA7() #If VBA7 Then Debug.Print "VBA7" #Else Debug.Print "Älteres VBA" #End If End Sub
Dies liefert für aktuelle Office-Versionen (ab Version 2010) den Wert VBA7.
32-Bit oder 64-Bit?
Auf die gleiche Weise können wir herausfinden, ob die aktuelle Office-Version in der 32-Bit- oder in der 64-Bit-Version vorliegt.
Hier verwenden wir die Kompilierungskonstante Win64:
Public Sub Is32Or64Bit() #If Win64 Then Debug.Print "64-Bit" #Else Debug.Print "32-Bit" #End If End Sub
Wir können auch explizit auf die 32-Bit-Version prüfen:
#If Win32 Then
Debug.Print "32-Bit"
#Else
Debug.Print "64-Bit"
#End If
Bedingte Kompilierung mit benutzerdefinierten Konstanten
Wir können auch eigene Kompilierungskonstanten definieren und diese per #If…#Then-Bedingung abfragen.
Diese Konstanten müssen ohne Datentyp angegeben werden und werden ebenfalls mit führemden Raute-Zeichen definiert, zum Beispiel:
#Const cEarlyBinding = -1
Die Konstanten dürfen außerdem nur Long-Werte enthalten.
Diese fragen wir dann wie folgt ab:
Public Sub EigeneKonstante() #If cEarlyBinding = -1 Then Debug.Print "cEarlyBinding ist True" #Else Debug.Print "cEarlyBinding ist False" #End If End Sub
Bedingte Kompilierung für Early Binding und Late Binding
Wenn wir auf dem Entwicklungsrechner mit Early Binding arbeiten wollen, um IntelliSense nutzen zu können, aber auf dem Produktivrechner sicherstellen wollen, dass das Projekt auch ohne Vorhandensein der jeweiligen Bibliothek zumindest ohne Kompilierfehler verwendet werden kann, können wir hier die Anweisungen zum Deklarieren und Initialisieren von Objektvariablen einfügen:
Public Sub EarlyBinding() #If cEarlyBinding = -1 Then Dim rst As adodb.Recordset Set rst = New adodb.Recordset #Else Dim rst As Object Set rst = CreateObject("ADODB.Recordset") #End If End Sub
Wenn wir #cEarlyBinding auf -1 einstellen, werden die Anweisungen im #If-Teil der Bedingung kompiliert und ausgeführt, anderenfalls die aus dem #Else-Teil.
Das können wir leicht prüfen, indem wir die Anweisungen schrittweise durchlaufen.
Wenn wir die Konstante #cEarlyBinding auf den Wert -1 einstellen und die Bibliothek Microsoft ActiveX Data Objects x.y nicht per Verweis eingebunden ist, erhalten wir außerdem einen Kompilierfehler (siehe Bild 1).

Bild 1: Kompilierfehler, weil die ADODB-Bibliothek fehlt
Hier müssen wir also, solange wir auf dem Entwicklungsrechner arbeiten, den Wert von #cEarlyBinding auf -1 einstellen und den Wert vor der Weitergabe auf 0 ändern.
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
den kompletten Artikel im PDF-Format mit Beispieldatenbank
diesen und alle anderen Artikel mit dem Jahresabo
