Dein Ratgeber zu Excel 32-Bit auf 64-Bit konvertieren

Worum geht’s wirklich?

Wenn jemand nach „Excel 32-Bit auf 64-Bit konvertieren“ sucht, meint er in 90 % der FĂ€lle:
„Meine VBA-Makros laufen nicht mehr nach Office-Neuinstallation“.
Und genau da setzt dieser Beitrag an – speziell fĂŒr Dich als Access-Entwickler, der ĂŒber Excel automatisiert.

Warum ĂŒberhaupt 64 Bit?

Microsoft verteilt Office 64 Bit seit Jahren als Standard.
Mehr Arbeitsspeicher, stabiler bei großen Datenmengen.
Klingt gut – bricht aber alte 32-Bit-VBA-Projekte zuverlĂ€ssig auseinander.
Vor allem bei:

  • API-Deklarationen
  • COM-Steuerelementen
  • DLL-Aufrufen
  • „Long“-Werten als Zeiger

Grundregel: Office 64 Bit braucht PtrSafe und LongPtr

Ohne diese beiden SchlĂŒsselwörter kracht’s.
Vor allem bei Declare-Anweisungen.

Vorher (32 Bit):

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _
    ByVal hwnd As Long, _
    ByVal lpOperation As String, _
    ByVal lpFile As String, _
    ByVal lpParameters As String, _
    ByVal lpDirectory As String, _
    ByVal nShowCmd As Long) As Long

Nachher (kompatibel mit beiden Welten):

#If VBA7 Then
    Private Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _
        ByVal hwnd As LongPtr, _
        ByVal lpOperation As String, _
        ByVal lpFile As String, _
        ByVal lpParameters As String, _
        ByVal lpDirectory As String, _
        ByVal nShowCmd As Long) As LongPtr
#Else
    Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _
        ByVal hwnd As Long, _
        ByVal lpOperation As String, _
        ByVal lpFile As String, _
        ByVal lpParameters As String, _
        ByVal lpDirectory As String, _
        ByVal nShowCmd As Long) As Long
#End If

Betroffene Typen im Überblick

Datentyp32 Bit64 BitLösung
Long4 Byte4 BytefĂŒr Zahlen ok
LongPtr4 Byte8 BytefĂŒr Zeiger nötig
LongLong—8 Bytenur unter 64 Bit
Integer2 Byte2 Bytekeine Änderung

Merksatz: Zeiger? → LongPtr.
Rechnen? → Long.
PlattformĂŒbergreifend? → mit #If VBA7 Then absichern.

Automatisch prĂŒfen: Welche Stellen sind kritisch?

Public Sub ScanneNachAPI()
    Dim comp As Object, i As Long, zeile As String
    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 "Achtung: " & comp.Name & ", Zeile " & i & ": " & zeile
            End If
        Next i
    Next
End Sub

COM-Objekte & DLLs: PrĂŒfen und ggf. austauschen

Wenn Du alte Steuerelemente wie MSCOMCTL.OCX, RICHTX32.OCX oder FM20.DLL nutzt:
Finger weg unter 64 Bit. Die funktionieren meist nur in 32 Bit.
Alternative: native Excel/Access-Steuerelemente oder .NET-Lösungen via COM.

Wenn Du aus Access heraus Excel steuerst

Auch hier musst Du aufpassen:

Dim xlApp As Object
Set xlApp = CreateObject("Excel.Application")

Das geht auch unter 64 Bit – solange kein 32-Bit-Only-AddIn geladen ist.
Fein raus bist Du, wenn Excel als reine COM-OberflÀche genutzt wird.

Bonus: So prĂŒfst Du die Bit-Version zur Laufzeit

Public Sub ZeigeOfficeVersion()
    MsgBox "Office-Version: " & Application.Version & vbCrLf & _
           "Bit-Version: " & IIf(Application.OperatingSystem Like "*64*", "64 Bit", "32 Bit")
End Sub

Oder noch besser:

#If Win64 Then
    Const ist64Bit = True
#Else
    Const ist64Bit = False
#End If

Du musst Excel nicht „konvertieren“ – sondern Deinen Code.

Die Umstellung auf 64 Bit ist nervig, aber ĂŒberschaubar.
Wenn Du systematisch alle API-Calls und Zeiger durchgehst, lÀuft das Ding wieder.

Wenn Du willst, helf ich Dir beim Umbau.
Pragmatisch, zeilenscharf, mit Blick auf Wartbarkeit.
Danach kannst Du beruhigt auch 64-Bit-Outlook, -Access und -Excel gleichzeitig fahren.

Keine Antworten

Schreibe einen Kommentar

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