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
Long
stattLongPtr
- 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.
No responses yet