Worum geht’s?
Du hast Word-Makros, die noch aus 32-Bit-Zeiten stammen – und jetzt kracht alles unter 64 Bit?
Dann bist Du nicht allein.
Die meisten Fehler hÀngen an alten Declare-Statements und falschen Datentypen.
Das Gute: Mit etwas Systematik kriegst Du Deine Makros wieder ans Laufen.
Problemstellen im Ăberblick
Declare-Anweisungen ohnePtrSafe- Zeiger als
LongstattLongPtr - API-Aufrufe ohne bedingte Kompilierung
- Veraltete DLLs oder OCX-Steuerelemente
So findest Du die Fehler schnell
Public Sub FindeKritischeStellen()
Dim comp As Object, zeile As String, i As Long
For Each comp In Application.VBE.ActiveVBProject.VBComponents
For i = 1 To comp.CodeModule.CountOfLines
zeile = comp.CodeModule.Lines(i, 1)
If InStr(zeile, "Declare") > 0 And InStr(zeile, "PtrSafe") = 0 Then
Debug.Print "Möglicherweise problematisch: " & comp.Name & " / Zeile " & i & ": " & zeile
End If
Next i
Next
End Sub
Grundregel: Immer PtrSafe und LongPtr verwenden
Alt (32 Bit):
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Neu (kompatibel mit 64 Bit):
#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
Welche Datentypen sind betroffen?
| Datentyp | 32 Bit | 64 Bit | Empfehlung |
|---|---|---|---|
| Long | 4 Byte | 4 Byte | fĂŒr Zahlen ok |
| LongPtr | 4 Byte | 8 Byte | fĂŒr Zeiger nötig |
| LongLong | â | 8 Byte | nur unter 64 Bit |
| Integer | 2 Byte | 2 Byte | bleibt gleich |
Typisches Beispiel aus Word: Fensterposition setzen
#If VBA7 Then
Private Declare PtrSafe Function SetWindowPos Lib "user32" ( _
ByVal hwnd As LongPtr, _
ByVal hWndInsertAfter As LongPtr, _
ByVal x As Long, ByVal y As Long, _
ByVal cx As Long, ByVal cy As Long, _
ByVal wFlags As Long) As Long
#Else
Private Declare Function SetWindowPos Lib "user32" ( _
ByVal hwnd As Long, _
ByVal hWndInsertAfter As Long, _
ByVal x As Long, ByVal y As Long, _
ByVal cx As Long, ByVal cy As Long, _
ByVal wFlags As Long) As Long
#End If
Word-eigenes Fenster ermitteln:
Public Sub FensterNachVorne()
Dim hwnd As LongPtr
hwnd = FindWindow("OpusApp", vbNullString)
Call SetWindowPos(hwnd, 0, 0, 0, 800, 600, 0)
End Sub
Wenn Du Word aus Access steuerst
Auch dann muss Dein Code fit sein – denn Word lĂ€uft in der gleichen Bit-Umgebung wie Access.
Dim wdApp As Object
Set wdApp = CreateObject("Word.Application")
wdApp.Visible = True
wdApp.Documents.Add
wdApp.Selection.TypeText "Moin aus Access."
Funktioniert – solange keine Altlasten in der Word-Vorlage oder dem Makro-Modul stecken.
Office-Bit-Version prĂŒfen zur Laufzeit
Public Sub OfficeBitInfo()
#If Win64 Then
MsgBox "64 Bit-Office erkannt."
#Else
MsgBox "32 Bit-Office erkannt."
#End If
End Sub
Wenn Du Word-Makros aus der 32-Bit-Zeit ĂŒbernimmst, musst Du sauber refactoren.
Ohne PtrSafe und LongPtr geht unter 64 Bit gar nichts.
Am besten: alles einmal scannen, dann gezielt korrigieren – und danach stressfrei weitermachen.
Wenn Du willst, prĂŒf ich Deinen Code und mach ihn 64-Bit-fit.
Mit norddeutscher Ruhe und Erfahrung.