Normalerweise ist es beim Programmieren mit VBA fast vollkommen egal, mit welcher Officeversion man es zu tun hat. Da aber die API-Programmierung unmittelbar mit Windows kommuniziert, muss man seit Office 2010 unterscheiden, ob Office in einer 32- oder 64-Bit Version verwendet wird (16-Bit Versionen sind ausgestorben und müssen nicht mehr berücksichtigt werden).
Standardmäßig wird Office bis einschließlich Version 2016 als 32-Bit installiert,
aber unter einem 64-Bit Windows kann man ab Office 2010 alternativ auch ein 64-Bit
Setup nutzen. Office 2019 versucht sich dagegen standardmäßig als 64-Bit zu installieren,
wenn auch Windows als 64-Bit installiert ist, aber man kann alternativ auch das
32-Bit Setup verwenden. Um konvertierbaren und zukunftsfähigen Code zu schreiben,
muss man nun bei der API-Programmierung berücksichtigen, dass unter einem 64-Bit
Office manche Parameter mit 64-Bit übergeben werden müssen. Außerdem muss die
Declare-Anweisung zwingend
PtrSafe
enthalten.
Natürlich will nun niemand für jeden denkbaren Fall eine eigene Codeversion schreiben. Daher können die einzelnen Fälle mit Hilfe der bedingten Kompilierung und eigens dafür vorgesehenen Kompilerkonstanten unterschieden werden:
Sub Version() #If VBA7 Then #If Win64 Then Debug.Print "Neueres 64-Bit Office, setzt 64-Bit Windows voraus" #Else Debug.Print "Neueres 32-Bit Office, 32- oder 64-Bit Windows" #End If #Else Debug.Print "Älteres 32-Bit Office" #End If End Sub
Unser Eingangsbeispiel zum Ermitteln des Systemverzeichnisses muss also lauten:
#If VBA7 Then Private Declare PtrSafe Function GetSystemDirectoryA Lib "kernel32" _ (ByVal lpBuffer As String, ByVal nSize As Long) As Long #Else Private Declare Function GetSystemDirectoryA Lib "kernel32" _ (ByVal lpBuffer As String, ByVal nSize As Long) As Long #End If
Public Function GetSystemDirectory() As String Dim lngLen As Long, lpBuffer As String, nSize As Long nSize = 255 lpBuffer = String(nSize, vbNullChar) lngLen = GetSystemDirectoryA(lpBuffer, nSize) GetSystemDirectory = Left(lpBuffer, lngLen) End Function
Der Unterschied besteht also vor allem in PtrSafe
.
Aus den bisherigen Erläuterungen ergibt sich: In Office bis einschließlich 2007
darf PtrSafe
nicht enthalten sein, in neueren
32-Bit Versionen darf es enthalten sein, und in 64-Bit Versionen muss es
enthalten sein. Die bedingte Kompilierung stellt dabei sicher, dass der Code unter
allen Versionen funktioniert.