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 PtrSafe
ergänzen- Zeigertypen prüfen und ggf. in
LongPtr
umwandeln - 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.
No responses yet