Bedingte Kompilierung

Aus DBWiki
Wechseln zu: Navigation, Suche

Definition

Mit Compiler-Direktiven kann bestimmt werden, welche Code-Abschnitte der VBA-Compiler auswertet. Dabei orientiert sich der Compiler an fest eingebauten oder selbst definierten Konstanten. Compiler-Direktiven werden mit einem Rautezeichen (#) eingeleitet. Von Compiler-Direktiven auszuwertende Code-Abschnitte werden durch logische Blöcke in dieser Form gebildet:

#Const Konstantenname = <ein_beliebiger_Ganzzahl_Wert>
 
#If Konstantenname = 4711 Then
' Anweisungen oder Deklarationen  
#Else ' optional
' Anweisungen oder Deklarationen
#End If

Verschachtelungen von Direktiven sind möglich. Ebenso können mehrere Konstanten in einem Ausdruck mit And und Or logisch verknüpft werden.

#Const VerwendeLateBinding = 1
 
#If Vba7 Then
   #If Win32 Then
      ' Anweisungen oder Delarationen für Windows 32 Bit
   #ElseIf Win64 Then
      'Anweisungen oder Delarationen für Windows 64 Bit
   #EnD If
#ElseIf Vba6 And VerwendeLateBinding = 1 Then
   'Anweisungen oder Delarationen für VBA6 und eingeschaltetes Late Binding
#Else
   'Anweisungen oder Delarationen für VBA6 und ausgeschaltetes Late Binding
#End If

Anwendungsfälle

Mit Einführung von Office 2010 stehen alle Anwendungen des Pakets auch in 64-Bit Versionen zur Verfügung. Um eine Anwendung individuell unter beiden Rechner-Architekturen betreiben zu könne, hat Microsoft den neuen Datentyp LongPtr eingeführt, der in einer 32-Bit Umgebung über 4 Byte (analog dem Datentyp Long) und in einer 64-Bit Umgebung jedoch über 8 Byte an Speicherplatz verfügt. Zusätzlich wurden neue interne Compilerkonstanten eingeführt, um durch bedingte Kompilierung den richtigen Code-Abschnitt zu wählen. API-Funktionen müssen zusätzlich mit dem Schlüsselwort PtrSafe deklariert sein, wenn die Anweisung auch in einer 64-Bit Office Anwendung lauffähig sein soll.


Andere Möglichkeiten können für das Debuggen einer Anwendung genutzt werden. Dazu definiert man in einem Modul eine eigene Konsante für diesen Zweck und stellt ihren Wert entsprechend des gewünschten Ablaufs ein.

Option Explicit
 
#Const DebugMode = 1 ' kann nach erfolgreicher Prüfung des Codes später auf 0 gesetzt werden
 
Public Sub EineProzedur()
   #If DebugMode = 1 Then
      'mach etwas
   #Else ' optional
      'mach etwas anderes
   #End If
   'mach das immer
End Sub


Eine weitere Möglichkeit besteht darin, beliebigen Freittext, z. Bsp. eine Lizenz im Code anzeigen zu können, ohne Kommentarzeichen im Text verwenden zu müssen.

#If 0 Then ' Bereich wird niemals ausgewertet - es werden jedoch Syntaxfehler angezeigt
/* 
 * This file is part of the XXX distribution (https://github.com/xxxx or http://xxx.github.io).
 * Copyright (c) 2018 Dein Name hier.
 * 
 * This program is free software: you can redistribute it and/or modify  
 * it under the terms of the GNU General Public License as published by  
 * the Free Software Foundation, version 3.
 *
 * This program is distributed in the hope that it will be useful, but 
 * WITHOUT ANY WARRANTY; without even the implied warranty of 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License 
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
#End If
 
Option Explicit
 
' ...


Um nicht in alle Modulen eine Deklaration eigener Konstanten vornehmen zu müssen, kann man im VBA-Projekt unter dem Menüpunkt Extras - Eigenschaften von (Datenbankname) ..., Registerkarte Allgemein, im Feld Argumente für die bedingte Kompilierung entsprechende Konstanten eintragen. Bei mehr als einer Konstanten dient dabei der Doppelpunkt zur Trennung der Angaben,
z. Bsp.: DebugMode = 1 : VerwendeLateBinding = 0 : LoggeBenutzer = 1

Nachteile

  • Der Code wird länger.
  • Der Code ist schlechter lesbar.