Warum Du das Thema nicht lÀnger schieben solltest

Office 64 Bit ist mittlerweile Standard.
Neue Rechner, neue Installationen – oft automatisch 64 Bit.
Dein 32-Bit-Access-Frontend lÀuft dann nicht mehr ohne Umbau.
Und zwar nicht „ein bisschen nicht“ – sondern gar nicht.

Was sich bei 64 Bit Àndert

  • API-Deklarationen brauchen PtrSafe
  • ZeigergrĂ¶ĂŸen mĂŒssen mit LongPtr angepasst werden
  • ActiveX-Steuerelemente können Probleme machen
  • COM-Komponenten mĂŒssen 64 Bit unterstĂŒtzen

Schritt 1: PrĂŒfen, ob Dein Code betroffen ist

Du hast nichts zu tun, wenn:

  • kein Declare-Statement im Code
  • kein Zugriff auf Windows-API
  • keine COM-DLLs im Einsatz

Aber: Sobald API-Deklarationen auftauchen, geht der Spaß los.

' 32 Bit (falsch fĂŒr 64 Bit)
Private Declare Function GetTickCount Lib "kernel32" () As Long
' 64-Bit-kompatibel
#If VBA7 Then
    Private Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long
#Else
    Private Declare Function GetTickCount Lib "kernel32" () As Long
#End If

Schritt 2: Typen ĂŒberarbeiten

Ersetze Long durch LongPtr, wenn’s sich um Speicheradressen handelt.
Das betrifft meistens Handles, Pointer oder RĂŒckgabewerte von API-Calls.

#If VBA7 Then
    Dim hwnd As LongPtr
#Else
    Dim hwnd As Long
#End If

Schritt 3: COM-DLLs und ActiveX prĂŒfen

Viele alte Steuerelemente laufen nur unter 32 Bit.
Beispiel: MSCOMCTL.OCX oder Àltere PDF-Viewer.
Wenn’s rummuckt: Komponente raus oder gegen moderne Lösung tauschen.

Schritt 4: Saubere Testumgebung aufbauen

Am besten eine virtuelle Maschine mit 64-Bit-Office.
Oder Office 365 Click-to-Run in 64 Bit.

Dann:

  • Kompiliere Dein Projekt mit Option Explicit
  • Fange Fehler mit Debug.Print und Logging
  • Laufzeit testen mit mehreren Benutzern

Schritt 5: Projekt vorbereiten

ErgĂ€nze Deine Deklarationen so, dass beide Welten unterstĂŒtzt werden.
Stichwort: bedingte Kompilierung.

#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

Typenvergleich 32 Bit vs. 64 Bit

Typ32 Bit64 Bit
Long4 Byte4 Byte
LongPtr4 Byte8 Byte
LongLongnicht verfĂŒgbar8 Byte
Integer2 Byte2 Byte

Typische Fehlerquellen

  • Copy\&Paste aus alten ForumsbeitrĂ€gen
  • selbst geschriebene DLLs
  • RĂŒckgabewerte ohne PrĂŒfung
  • keine Fehlerbehandlung in API-Calls

Bonus: Eigene Tools

Ich hab mir ein Makro gebaut, das alle Module scannt und Declare-Zeilen auflistet:

Public Sub ScanneAufDeclare()
    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 Then Debug.Print comp.Name & ": " & zeile
        Next i
    Next
End Sub

Mein Fazit

Du kannst Access nicht ewig auf 32 Bit festnageln.
Wenn Du professionell arbeitest, geh das Thema jetzt an.
Mach’s systematisch: Typen, API, COM prĂŒfen – dann rennt Dein Code auch unter 64 Bit.
Und wenn nicht: Ich helf Dir gern beim Umbau.

Categories:

Tags:

No responses yet

Schreibe einen Kommentar

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