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 ohne PtrSafe
  • Zeiger als Long statt LongPtr
  • 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?

Datentyp32 Bit64 BitEmpfehlung
Long4 Byte4 BytefĂŒr Zahlen ok
LongPtr4 Byte8 BytefĂŒr Zeiger nötig
LongLong—8 Bytenur unter 64 Bit
Integer2 Byte2 Bytebleibt 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.

Tags:

No responses yet

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert