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.
No responses yet