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

FehlerbeschreibungUrsacheLösung
„Deklaration ungĂŒltig“Kein PtrSafeDeclare PtrSafe Function verwenden
Fehler 48 oder 453 bei DLL-AufrufDLL ist nur 32-Bit64-Bit-Version verwenden
„ActiveX kann nicht geladen werden“Steuerelement nicht 64-BitAlternative suchen (FormControls)
Excel stĂŒrzt ab bei UserForm-StartInkompatibler Control auf FormEntfernen 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

BereichUmsetzung
API-CallsAlle in modAPI.bas zentralisiert
Long vs. LongPtrZeigerparameter konsequent auf LongPtr
UserFormsNur Standardsteuerelemente verwenden
DLLsSeparate Builds fĂŒr 64-Bit
TestsGetrennte 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.

Tags:

No responses yet

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert