Beitrag aus SmartTools Excel Weekly
VBA-Makros an 64-Bit-Excel anpassen
Excel 365 2024 2021 2019 2016 2013
FRAGE Wir sind dabei, unsere Office-Umgebung von 32 Bit auf 64 Bit umzustellen. Dabei musste ich allerdings feststellen, dass gleich mehrere unserer VBA-Makros in der 64-Bit-Umgebung nicht mehr funktionieren. Kennen Sie eine Automatik, mit der ich meine Makros auf 64 Bit umstellen kann? Oder wissen Sie, welche manuellen Änderungen ich vornehmen muss? Oder ist eine Umstellung eventuell gar nicht möglich?
B. Ewald
ANTWORT Die meisten VBA-Makros, die Sie in einer 32-Bit-Excel-Version erstellt haben, laufen unverändert auch in einer 64-Bit-Umgebung. Wenn es doch zu Fehlern kommt, setzen Sie in Ihren Makros vermutlich Windows-API-Funktionen ein. In diesem Fall müssen Sie die entsprechenden Deklarationen und die Variablen, die sich auf API-Funktionen beziehen, an die 64-Bit-Umgebung anpassen. Am besten stellen Sie Ihren Makrocode dann so um, dass er sowohl unter einem 32-Bit- als auch einem 64-Bit-Excel läuft.
Ein Tool, das diese Umstellung automatisch erledigt, gibt es allerdings nicht. Sie müssen Ihren Code manuell anpassen. Wertvolle Hinweise dazu bietet Microsoft zum Beispiel auf diese Webseite an.
Eine bedingte Kompilierung ist in vielen Fällen aber gar nicht nötig. Insbesondere eine bedingte Kompilierung, die die Konstante "VBA7" überprüft, brauchen Sie nur dann, wenn Ihre Makros auch noch in Excel 2007 oder früher lauffähig sein sollen. Schon Excel 2010 arbeitet mit der neuen VBA-Umgebung.
Oft sind dann nur geringfügige Änderungen am bestehenden Makrocode notwendig, um diesen fit für einen alternativen Einsatz in 32-Bit- oder 64-Bit-Umgebungen zu machen. So bietet sich zum Beispiel der Datentyp "LongPtr" an, wenn ein Zeiger oder Handler deklariert werden muss. "LongPtr" wird automatisch in die passende Byte-Größe umgewandelt, je nachdem in welcher Bit-Umgebung der Code ausgeführt wird.
Und in der Deklaration einer API-Funktion müssen Sie nur "PtrSafe" hinzufügen, um eine Kompatibilität zu 64-Bit-Umgebungen zu gewährleisten.
Der folgende Code für die Deklaration der API-Funktion, die den Speichern unter-Dialog ausführt, ist beispielsweise sowohl im 32-Bit- als auch im 64-Bit-Excel lauffähig:
Private Type OPENFILENAME
lStructSize As Long
hwndOwner As LongPtr
hInstance As LongPtr
lpstrFilter As String
lpstrCustomFilter As String
nMaxCustrFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
Flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustData As Long
lpfnHook As LongPtr
lpTemplateName As String
End Type
Private Declare PtrSafe Function GetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA" (pOpenfilename As OPENFILENAME) As Long