VBA: Bedingte Kompilierung nutzen

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).

Kompilierfehler, weil die ADODB-Bibliothek fehlt

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

Schreibe einen Kommentar