Versionsunterschiede

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.