Wenn „Declare“ plötzlich meckert
Du kennst das:
Dein Excel-Tool lÀuft seit Jahren problemlos.
Dann kommt Office 365 in 64–Bit –
und auf einmal streikt der VBA-Code.
Fehler wie „Deklaration ungĂŒltig“ oder „Laufzeitfehler 48“.
Meist liegt’s an API-Calls, veralteten ActiveX-Komponenten oder falsch deklarierten Variablen.
Ich zeig Dir, wie ich den Umstieg auf 64-Bit sauber absichere.
Schritt 1: PrĂŒfen, ob Excel 64-Bit lĂ€uft
Public Function IstExcel64Bit() As Boolean
#If Win64 Then
IstExcel64Bit = True
#Else
IstExcel64Bit = False
#End If
End Function
Alternativ: Datei â Konto â Info â „64-Bit“ oder „32-Bit“ steht direkt dabei.
Schritt 2: API-Deklarationen umstellen
Jede Windows-API-Funktion muss mit PtrSafe deklariert sein.
Und Zeiger vom Typ Long werden zu LongPtr.
Alt (32-Bit-only):
Declare Function GetTickCount Lib "kernel32" () As Long
Neu (kompatibel):
#If VBA7 Then
Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long
#Else
Declare Function GetTickCount Lib "kernel32" () As Long
#End If
Zeigerparameter z. B. bei ShellExecute:
#If VBA7 Then
Private Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _
ByVal hwnd As LongPtr, ByVal lpOperation As String, _
ByVal lpFile As String, ByVal lpParameters As String, _
ByVal lpDirectory As String, ByVal nShowCmd As Long) As LongPtr
#Else
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _
ByVal hwnd As Long, ByVal lpOperation As String, _
ByVal lpFile As String, ByVal lpParameters As String, _
ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
#End If
Schritt 3: LongPtr im Code richtig einsetzen
LongPtr ist kein Datentyp, sondern ein Typalias.
Er wird unter 64-Bit zu LongLong, unter 32-Bit zu Long.
Beispiel:
Dim hWnd As LongPtr
hWnd = Application.hwnd
Damit kannst Du API-kompatible Handles auch in Excel sicher verwenden.
Schritt 4: Externe DLLs und COM-Objekte prĂŒfen
Wenn Du per VBA eine externe DLL nutzt, muss auch diese 64-Bit-kompatibel sein.
Sonst bekommst Du Fehler wie „Datei nicht gefunden“ oder „Fehler beim Laden“.
Beispiel:
#If VBA7 Then
Declare PtrSafe Function MeineFunktion Lib "meinedll64.dll" () As LongPtr
#End If
Wenn Du die DLL nicht ersetzen kannst:
â Separate 32-Bit-Excel-Version bereitstellen
â Oder die Funktion in eine 64-Bit-fĂ€hige .NET-Bridge auslagern
Schritt 5: ActiveX-Steuerelemente meiden
Viele alte Excel-Formulare nutzen ActiveX (z. B. Kalender, FlexGrid, TreeView).
Die laufen nicht stabil unter 64-Bit.
Teilweise gar nicht.
Ersetze sie durch:
- Formularsteuerelemente (Insert â Forms)
- Shapes mit VBA-Logik
- ContentControls (ĂŒber Word Automation)
- Oder: ModernUI per WebView2 (HTML + JS)
Tabelle: Fehler und Lösungen bei Excel 64-Bit
| Fehlerbeschreibung | Ursache | Lösung |
|---|---|---|
| „Deklaration ungĂŒltig“ | Kein PtrSafe | Declare PtrSafe Function verwenden |
| Fehler 48 oder 453 bei DLL-Aufruf | DLL ist nur 32-Bit | 64-Bit-Version verwenden |
| „ActiveX kann nicht geladen werden“ | Steuerelement nicht 64-Bit | Alternative suchen (FormControls) |
| Excel stĂŒrzt ab bei UserForm-Start | Inkompatibler Control auf Form | Entfernen oder ersetzen |
Beispiel: Fensterhintergrund per API Àndern
#If VBA7 Then
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" ( _
ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
#Else
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
ByVal lpClassName As String, ByVal lpWindowName As String) As Long
#End If
Public Sub FindeExcelFenster()
Dim hWnd As LongPtr
hWnd = FindWindow("XLMAIN", Application.Caption)
MsgBox "Handle: " & hWnd
End Sub
Mein Setup fĂŒr saubere Migrationen nach Excel 64-Bit
| Bereich | Umsetzung |
|---|---|
| API-Calls | Alle in modAPI.bas zentralisiert |
| Long vs. LongPtr | Zeigerparameter konsequent auf LongPtr |
| UserForms | Nur Standardsteuerelemente verwenden |
| DLLs | Separate Builds fĂŒr 64-Bit |
| Tests | Getrennte Office-VMs 32-Bit und 64-Bit |
VBA in Excel lÀuft auch in 64-Bit. Aber eben nicht einfach so.
Wenn Dein Code alt ist, brauchst Du Handarbeit.
Mach sie einmal grĂŒndlich –
dann lĂ€uft’s fĂŒr die nĂ€chsten 10 Jahre stabil.
Egal ob 32 oder 64 Bit.