Wenn plötzlich alles âDeclareâ schreit
Die Umstellung auf Office 64-Bit kommt oft nicht geplant.
Plötzlich hat jemand das neue Office 365 installiert.
Und Deine Access-App?
SchmeiĂt Fehler wie Fehler 48: DLL-Ladefehler
oder Die Deklaration ist ungĂŒltig
.
Klassiker: API-Calls, falsch deklarierte Pointer, fehlende PTRSAFE.
Ich zeig Dir, wie ich die Migration sauber mache â ohne Wochen im Debugger zu sitzen.
Warum 64-Bit jetzt wichtig ist
- Microsoft empfiehlt 64-Bit bei allen Neuinstallationen
- Viele Systeme mit viel RAM laufen besser
- COM-Add-ins und Office-Automatisierung werden auf 64-Bit angepasst
- 32-Bit wird nicht verschwinden â aber Du musst mit beiden Varianten rechnen
Kurz: Neue Kunden haben fast immer 64-Bit.
Du brauchst Code, der beides kann.
Schritt 1: Welche Version ist installiert?
Public Function Ist64BitOffice() As Boolean
#If Win64 Then
Ist64BitOffice = True
#Else
Ist64BitOffice = False
#End If
End Function
Oder direkt prĂŒfen:
MsgBox Application.OperatingSystem & vbCrLf & Application.Version
Schritt 2: API-Deklarationen anpassen
Jede API-Funktion muss PtrSafe
sein.
Und alle Long-Zeiger â LongPtr
.
Beispiel alt (funktioniert nur in 32-Bit):
Declare Function GetTickCount Lib "kernel32" () As Long
Neu (kompatibel mit beidem):
#If VBA7 Then
Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long
#Else
Declare Function GetTickCount Lib "kernel32" () As Long
#End If
Noch besser:
#If VBA7 Then
Private Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
#Else
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
#End If
Und Long
â LongPtr
bei Zeigern:
#If VBA7 Then
Private Declare PtrSafe Function SetTimer Lib "user32" ( _
ByVal hWnd As LongPtr, ByVal nIDEvent As LongPtr, _
ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As LongPtr
#End If
Schritt 3: ActiveX-Steuerelemente prĂŒfen
Viele alte Steuerelemente (z.âŻB. TreeView, CommonDialog, MSFlexGrid) laufen nicht unter 64-Bit.
Dann knalltâs beim Ăffnen des Formulars.
PrĂŒfen:
- MenĂŒ âExtras â Verweiseâ
- Register âSteuerelementeâ â nicht installierbare Komponenten erkennen
- Ersatz suchen: Modernere Controls oder native Alternativen
Tipp: TreeView aus MSComctlLib
ist nicht 64-Bit-tauglich.
Alternative: ListBox mit Rekursion oder WebView2 als Baumstruktur mit HTML.
Schritt 4: Access-Add-ins, DLLs, EXE
Wenn Du externe DLLs aufrufst, brauchst Du auch davon 64-Bit-Versionen.
Sonst kommt Fehler 53
(Datei nicht gefunden) oder Fehler 48
(DLL nicht ladefÀhig).
Gilt auch fĂŒr:
- externe .NET-Wrapper
- COM-Komponenten
- Shell-Execute-Calls
PrĂŒfen:
Shell "C:\Programme\MeinTool64.exe", vbNormalFocus
Schritt 5: Kompatibler Code fĂŒr beide Welten
Ich nutze #If VBA7 Then
und #If Win64 Then
, um selektiv anzupassen.
#If VBA7 Then
Private Declare PtrSafe Function CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(ByRef Destination As Any, ByRef Source As Any, ByVal Length As LongPtr) As LongPtr
#Else
Private Declare Function CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long) As Long
#End If
Damit lÀuft der Code unter 32- und 64-Bit.
Tabelle: HĂ€ufige Fehler beim Wechsel auf 64-Bit
Fehlerbeschreibung | Ursache | Lösung |
---|---|---|
âDie Deklaration ist ungĂŒltigâ | Kein PtrSafe | Declare PtrSafe nutzen |
Fehler 48: DLL nicht ladefÀhig | 32-Bit-DLL in 64-Bit Access | 64-Bit-Version der DLL verwenden |
Fehler beim Ăffnen von Formularen | Nicht kompatibles ActiveX | Ersatz durch unterstĂŒtzte Controls |
Code funktioniert auf altem PC, aber nicht mehr | Long statt LongPtr | API-Deklaration anpassen |
Mein Setup fĂŒr Migrationen auf 64-Bit Access
Bereich | Umsetzung |
---|---|
Code-Scan | Volltextsuche nach Declare , PtrSafe |
Verweise | nur 64-Bit-taugliche COM-Komponenten |
Tests | auf 32-Bit und 64-Bit parallel |
API-Wrapper | in Modul modAPI_Compat.bas auslagern |
Office-Detection | mit #If Win64 Then und VBA7 |
Access lĂ€uft auch unter 64-Bit â aber nur, wenn Du den Code darauf vorbereitet hast.
Wenn es kracht, liegtâs selten an Access. Meist an alten Deklarationen, vergessenen DLLs und zu viel Copy & Paste aus 2002.
Machâs sauber.
Dann lĂ€uftâs.
Auch in 64-Bit.
No responses yet