Warum 64 Bit jetzt wichtig ist
Viele KMU arbeiten immer noch mit Office 32 Bit.
Aber: Microsoft schiebt 64 Bit als Standard.
Neue Rechner, neue Installationen – oft automatisch 64 Bit.
Das Problem: Alte VBA-Projekte laufen nicht mehr ohne Anpassung.
Das betrifft vor allem API-Deklarationen und Zeiger.
Was Du ändern musst
1. PtrSafe-Kennzeichnung
Jede API-Deklaration muss PtrSafe enthalten.
Ohne das läuft der Code nicht unter 64 Bit.
#If VBA7 Then
Private Declare PtrSafe Function Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) As Long
#Else
Private Declare Function Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) As Long
#End If
2. LongPtr statt Long für Zeiger
Unter 64 Bit sind Zeiger 64 Bit breit.Long reicht nicht mehr – Du brauchst LongPtr.
#If VBA7 Then
Dim hwnd As LongPtr
#Else
Dim hwnd As Long
#End If
3. Typen prüfen und anpassen
Viele API-Funktionen erwarten jetzt LongPtr, LongLong oder Any.
Du solltest alle Deklarationen durchsehen.
Beispiel: FindWindow anpassen.
#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
Typenvergleich 32 vs. 64 Bit
| Typ | 32 Bit | 64 Bit |
|---|---|---|
| Long | 4 Byte | 4 Byte |
| LongLong | nicht verfügbar | 8 Byte |
| LongPtr | 4 Byte | 8 Byte |
| Integer | 2 Byte | 2 Byte |
| String | gleich | gleich |
Merksatz: Zeiger → immer LongPtr.
Mathematik → lieber Long oder LongLong.
Wie Du vorgehst
Schritt-für-Schritt
- Alle
Declare-Anweisungen suchen PtrSafeergänzen- Zeigertypen prüfen und ggf. in
LongPtrumwandeln - Testen auf 64 Bit
- Final gegenprüfen auf 32 Bit – wegen Kompatibilität
Optional: Automatisierung
Ich hab mir dafür ein kleines Tool gebaut, das alle Module scannt:
Public Sub DeklarationenPrüfen()
Dim comp As Object
For Each comp In Application.VBE.ActiveVBProject.VBComponents
If comp.Type = 1 Then ' nur Standard-Module
If InStr(comp.CodeModule.Lines(1, comp.CodeModule.CountOfLines), "Declare") > 0 Then
Debug.Print comp.Name & " enthält API-Deklarationen"
End If
End If
Next
End Sub
Meine Empfehlung
Mach den Schritt jetzt.
Je länger Du wartest, desto größer der Umbau später.
Access lebt noch – aber nur, wenn Du Deine Projekte pflegst.