Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: 32-64 Bit Problem

32-64 Bit Problem
02.02.2013 12:17:00
Albert
Hallo VBA Experten,
ich bringe das folgende Makro unter der 64 Bit Version von Office 10 nicht zum Laufen. (In der 32 Bit Version funktionierte es problemlos)
Option Explicit
#If Win64 Then
Private Declare PtrSafe Function SetTimer Lib "user32" _
(ByVal hwnd As Long, ByVal nIDEvent As Long, _
ByVal uElapse As Long, ByVal lpTimerFunc _
As Long) As Long
Private Declare PtrSafe Function KillTimer Lib "user32" _
(ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Private Declare PtrSafe Function FindWindow Lib "user32" Alias _
"FindWindowA" (ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare PtrSafe Function GetWindow Lib "user32" _
(ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Declare PtrSafe Function GetClassName Lib "user32" _
Alias "GetClassNameA" (ByVal hwnd As Long, ByVal _
lpClassName As String, ByVal nMaxCount As Long) _
As Long
Private Declare PtrSafe Function GetWindowText Lib "user32" _
Alias "GetWindowTextA" (ByVal hwnd As Long, _
ByVal lpString As String, ByVal cch As Long) _
As Long
Private Declare PtrSafe Function SendMessageBynum& Lib "user32" _
Alias "SendMessageA" (ByVal hwnd As Long, ByVal _
wMsg As Long, ByVal wParam As Long, ByVal lParam _
As Long)
#Else
Private Declare Function SetTimer Lib "user32" _
(ByVal hwnd As Long, ByVal nIDEvent As Long, _
ByVal uElapse As Long, ByVal lpTimerFunc _
As Long) As Long
Private Declare Function KillTimer Lib "user32" _
(ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias _
"FindWindowA" (ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare Function GetWindow Lib "user32" _
(ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Function GetClassName Lib "user32" _
Alias "GetClassNameA" (ByVal hwnd As Long, ByVal _
lpClassName As String, ByVal nMaxCount As Long) _
As Long
Private Declare Function GetWindowText Lib "user32" _
Alias "GetWindowTextA" (ByVal hwnd As Long, _
ByVal lpString As String, ByVal cch As Long) _
As Long
Private Declare Function SendMessageBynum& Lib "user32" _
Alias "SendMessageA" (ByVal hwnd As Long, ByVal _
wMsg As Long, ByVal wParam As Long, ByVal lParam _
As Long)
#End If
#If VBA7 Then
Private iPasswortchar As LongPtr
Private hlngTimerKennung As LongPtr
Private iTitel As String
Private Const EM_SETPASSWORDCHAR = &HCC
Private Const GW_CHILD = 5
Private Const GW_HWNDFIRST = 0
Private Const GW_HWNDNEXT = 2
#Else
Private iPasswortchar As Long
Private hlngTimerKennung As Long
Private iTitel As String
Private Const EM_SETPASSWORDCHAR = &HCC
Private Const GW_CHILD = 5
Private Const GW_HWNDFIRST = 0
Private Const GW_HWNDNEXT = 2
#End If
Private Sub TimerSetzen()
hlngTimerKennung = SetTimer(0, 0, 200, AddressOf ApiTimer)
If hlngTimerKennung = 0 Then MsgBox _
"Fehler beim Initialisieren des Timers"
End Sub
Die Fehlermeldung kommt bei "AddressOf ApiTimer" und lautet folgendermassen:
Fehler beim Kompilieren
Typen unverträglich
Ich bitte um Unterstützung und bedanke mich im Vorhinein
Albert

Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: 32-64 Bit Problem
02.02.2013 12:24:49
mumpel
Hallo!
"PtrSafe" alleine genügt nicht. Ein paar "Long" in der Klammer müssen durch "LongPtr" ersetzt werden. Und ein paar "Long" nach der Klammer durch "LongLong". Damit musst Du Dich noch näher beschäftigen.
Gruß, René

AW: 32-64 Bit Problem
02.02.2013 13:28:24
Albert
Hallo René,
danke für Deinen Tipp, ich habe versucht Ihn umzusetzen und auch versucht zu recherchieren. Nur leider sind meine VBA-Kenntnisse zu gering um den Dingen wirklich auf den Grund gehen zu können.
Ergebnis der Veränderung ist folgende: Das Makro läuft bis zur Einblendung des Passwortfensters - nur ist jetzt keine Eingabe mehr möglich - Excel ist eingefroren und kann nur mehr mit dem Taskmanager beendet werden.
Gruß, Albert

Anzeige
AW: 32-64 Bit Problem
02.02.2013 17:46:50
Albert
Hallo Jochen,
vielen Dank für die Info, ich habe gerade auf der Seite geblättert. Es wird eine Zeitlang daueren bis ich all die Informationen verarbeiten und hoffentlich auch umsetzen kann.
Schönen Abend,
Albert
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

32-64 Bit Problem in Excel VBA


Schritt-für-Schritt-Anleitung

Um ein VBA-Makro unter der 64-Bit-Version von Excel korrekt auszuführen, beachte folgende Schritte:

  1. Wechsel der Datentypen: Ersetze alle Long-Datentypen, die als Zeiger verwendet werden, durch LongPtr. Dies ist notwendig, da Long in der 64-Bit-Version nicht mehr ausreichend ist.

  2. Verwendung von PtrSafe: Stelle sicher, dass alle Declare-Anweisungen mit dem PtrSafe-Schlüsselwort versehen sind, um die Kompatibilität mit 64-Bit zu gewährleisten.

  3. Anpassung der API-Deklarationen: Stelle sicher, dass die Deklarationen für Funktionen wie SetTimer und FindWindow korrekt sind. Beispiel:

    #If Win64 Then
    Private Declare PtrSafe Function SetTimer Lib "user32" _
    (ByVal hwnd As LongPtr, ByVal nIDEvent As Long, _
    ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As LongPtr
    #Else
    Private Declare Function SetTimer Lib "user32" _
    (ByVal hwnd As Long, ByVal nIDEvent As Long, _
    ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
    #End If
  4. Überprüfung von AddressOf: Achte darauf, dass die Verwendung von AddressOf in der 64-Bit-Version korrekt ist. Beispielsweise:

    hlngTimerKennung = SetTimer(0, 0, 200, AddressOf ApiTimer)
  5. Fehlermeldungen überprüfen: Wenn Du die Fehlermeldung „Typen unverträglich“ erhältst, überprüfe die Datentypen in den Klammern der Declare-Anweisungen und passe sie entsprechend an.


Häufige Fehler und Lösungen

  • Fehler: „Typen unverträglich“: Dies tritt häufig auf, wenn ein falscher Datentyp verwendet wird. Stelle sicher, dass alle Zeiger durch LongPtr ersetzt werden.

  • Excel friert ein: Wenn Excel nach der Passwortabfrage nicht mehr reagiert, könnte dies an einer nicht korrekt deklarierten Funktion liegen. Überprüfe die Declare-Anweisungen und den AddressOf-Verweis.

  • Kompilierungsfehler: Achte darauf, dass alle PtrSafe-Deklarationen korrekt sind und dass Du die richtigen Versionen der API-Funktionen verwendest.


Alternative Methoden

Wenn Du Schwierigkeiten mit der Verwendung der API-Deklarationen hast, kannst Du auch folgende alternative Methoden in Betracht ziehen:

  1. VBA-Funktionen anpassen: Anstatt auf API-Funktionen zurückzugreifen, kannst Du auch VBA-eigene Funktionen verwenden, die möglicherweise weniger komplex sind.

  2. 32-Bit Excel verwenden: Wenn das Projekt es zulässt, kannst Du auch die 32-Bit-Version von Excel verwenden, solange die Kompatibilität zu den anderen Benutzern gewährleistet ist.

  3. VBA-Alternativen: In einigen Fällen kann es hilfreich sein, die Funktionalität über Excel-Funktionen oder -Formeln zu implementieren, anstatt auf VBA zurückzugreifen.


Praktische Beispiele

Hier sind einige praktische Beispiele, um die Verwendung von Declare-Anweisungen in VBA zu verdeutlichen:

#If Win64 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

Verwende diese Deklarationen, um ein Fenster zu finden:

Dim hwnd As LongPtr
hwnd = FindWindow(vbNullString, "Fenstertitel")

Tipps für Profis

  • Verwende #If VBA7: Stelle sicher, dass Du den Compiler-Direktive #If VBA7 verwendest, um zwischen 32-Bit und 64-Bit zu unterscheiden.

  • Debugging: Nutze den Debugger in VBA, um den Code Schritt für Schritt durchzugehen und Fehlerquellen schneller zu identifizieren.

  • Externe Bibliotheken: Überlege, ob es sinnvoll ist, externe Bibliotheken zu nutzen, die die Interaktion mit der Windows-API vereinfachen.


FAQ: Häufige Fragen

1. Was ist der Unterschied zwischen Long und LongPtr in VBA?
LongPtr ist ein Datentyp, der je nach der Bit-Version von Excel (32-Bit oder 64-Bit) entweder als Long oder LongLong interpretiert wird, während Long immer 32 Bit bleibt.

2. Wie kann ich sicherstellen, dass mein Makro sowohl in 32-Bit als auch in 64-Bit funktioniert?
Verwende die Compiler-Direktiven #If Win64 und #If VBA7, um die richtigen Deklarationen für jede Umgebung zu definieren und die Kompatibilität zu gewährleisten.

3. Warum friert mein Excel nach der Verwendung von AddressOf ein?
Das Einfrieren kann auf eine falsche Konfiguration der API-Deklarationen oder auf einen Fehler in der zugehörigen Callback-Funktion hinweisen. Überprüfe die Deklarationen und den Code der Callback-Funktion gründlich.

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