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
Datentyp | 32 Bit | 64 Bit | Lösung |
---|---|---|---|
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 | keine Ă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