Live-Forum - Die aktuellen Beiträge
Datum
Titel
17.10.2025 10:28:49
16.10.2025 17:40:39
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: VBA 32-64bit Fehler

VBA 32-64bit Fehler
10.11.2015 17:12:45
PQuest:-)
Hallo,
ich habe ein Userform, in das ich ein Modul zum Drucken des Forms eingebunden habe, was auch unter Excel 2010 32 bit problemlos läuft. Jetzt hat es jemand unter Excel 2010 64 bit genutzt und erhält die Fehlermeldung:
Compile Error
The code in this project must be updatedfpor use on 64-bit system. Please review and update Declare statements and then mark them with the PTRSafe attribute.
Ausgelöst wird der Fehler wohl von diesen Zeilen:
Option Explicit
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Private Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long
Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (LpVersionInformation As OSVERSIONINFO) As Long
Private Type OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
End Type
Private Enum Constants
KEYEVENTF_KEYUP = &H2
VK_MENU = &H12
sngMargin = 1.5 'Breit der Seitenränder in cm
End Enum
Frage 1: Wie kann ich den Fehler eliminieren?
Frage 2: Wie kann ich sicherstellen, dass der Coder sowohl unter 32 als auch unter 64 bit funktionsfähig bleibt?
Danke im Voraus,
PQuest:-)

Anzeige

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA 32-64bit Fehler
10.11.2015 17:21:05
Nepumuk
Hallo,
so:
Private Declare PtrSafe Sub keybd_event Lib "user32.dll" ( _
    ByVal bVk As Byte, _
    ByVal bScan As Byte, _
    ByVal dwFlags As Long, _
    ByVal dwExtraInfo As LongPtr)
Private Declare PtrSafe Function MapVirtualKey Lib "user32.dll" Alias "MapVirtualKeyA" ( _
    ByVal wCode As Long, _
    ByVal wMapType As Long) As Long
Private Declare PtrSafe Function GetVersionEx Lib "kernel32.dll" Alias "GetVersionExA" ( _
    ByRef lpVersionInformation As OSVERSIONINFO) As Long

Gruß
Nepumuk

Anzeige
AW: VBA 32-64bit Fehler
10.11.2015 18:59:51
PQuest:-)
Hallo Nepumuk,
getestet und funktioniert.
Danke,
PQuest:-)
;
Anzeige
Anzeige

Infobox / Tutorial

VBA 32-64bit Fehler beheben


Schritt-für-Schritt-Anleitung

Um den Fehler "The code in this project must be updated for use on 64-bit system" zu beheben, musst Du die Declare-Anweisungen in Deinem VBA-Code anpassen. Hier sind die Schritte:

  1. Öffne das VBA-Editor-Fenster in Excel, indem Du ALT + F11 drückst.
  2. Finde die betroffenen Declare-Anweisungen. Diese könnten so aussehen:
    Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
    Private Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long
    Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (LpVersionInformation As OSVERSIONINFO) As Long
  3. Füge das PtrSafe-Attribut hinzu und passe die Datentypen an. Hier ein Beispiel, wie die Anweisungen nach der Anpassung aussehen sollten:
    Private Declare PtrSafe Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As LongPtr)
    Private Declare PtrSafe Function MapVirtualKey Lib "user32.dll" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long
    Private Declare PtrSafe Function GetVersionEx Lib "kernel32.dll" Alias "GetVersionExA" (ByRef lpVersionInformation As OSVERSIONINFO) As Long
  4. Speichere Deinen VBA-Code und teste das Userform erneut.

Häufige Fehler und Lösungen

  • Fehler: ptrsafe attribute 64 bit error

    • Lösung: Stelle sicher, dass alle Declare-Anweisungen das PtrSafe-Attribut enthalten und die richtigen Datentypen verwenden (z.B. LongPtr anstelle von Long für Zeiger).
  • Fehler: Compile Error

    • Lösung: Überprüfe, ob alle externen Bibliotheken wie user32 und kernel32 korrekt deklariert sind. Vergiss nicht, die Dateiendungen .dll in Deinen Anweisungen zu verwenden.

Alternative Methoden

Falls Du nicht die Declare-Anweisungen manuell anpassen möchtest, könntest Du auch auf VBA-Bibliotheken zurückgreifen, die bereits für 64-Bit optimiert sind. Diese Bibliotheken bieten oft zusätzliche Funktionen und sind einfacher zu verwenden.


Praktische Beispiele

Hier ist ein Beispiel, wie Du die GetVersionEx-Funktion mit dem aktualisierten Code verwenden kannst:

Private Type OSVERSIONINFO
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber As Long
    dwPlatformId As Long
    szCSDVersion As String * 128
End Type

Sub CheckOSVersion()
    Dim osInfo As OSVERSIONINFO
    osInfo.dwOSVersionInfoSize = Len(osInfo)
    If GetVersionEx(osInfo) Then
        MsgBox "Windows Version: " & osInfo.dwMajorVersion & "." & osInfo.dwMinorVersion
    End If
End Sub

Tipps für Profis

  • Verwende LongPtr für Zeiger und Handles unter 64-Bit, da dies helfen kann, viele Komplikationen zu vermeiden.
  • Teste Deine VBA-Projekte regelmäßig unter beiden Versionen (32-Bit und 64-Bit), um sicherzustellen, dass sie plattformübergreifend funktionieren.
  • Nutze die Windows API-Dokumentation, um sicherzustellen, dass Du die richtigen Funktionsaufrufe und Parameter verwendest.

FAQ: Häufige Fragen

1. Wie kann ich sicherstellen, dass der Code sowohl unter 32 als auch unter 64 Bit funktioniert?
Verwende bedingte Kompilierung, um den Code entsprechend der Plattform anzupassen. Beispiel:

#If VBA7 Then
    Private Declare PtrSafe Function ...
#Else
    Private Declare Function ...
#End If

2. Was ist das PtrSafe-Attribut?
Das PtrSafe-Attribut ist erforderlich, um anzugeben, dass der Code für 64-Bit-Versionen von VBA geeignet ist. Es signalisiert, dass die Funktion korrekt mit 64-Bit-Daten umgehen kann.

3. Welche Änderungen sind notwendig, wenn ich eine 32-Bit-Anwendung auf 64-Bit portiere?
Alle Declare-Anweisungen müssen das PtrSafe-Attribut enthalten und die Datentypen müssen entsprechend geändert werden, insbesondere bei Zeigern, wo LongPtr verwendet werden sollte.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige