Umschreiben von VBA-Funktionen für 64 Bit
Schritt-für-Schritt-Anleitung
Um die FindWindow und SendMessage Funktionen in Excel VBA für 64-Bit zu deklarieren, befolge diese Schritte:
- Öffne den VBA-Editor: Drücke
ALT + F11 in Excel.
- Füge ein neues Modul hinzu: Klicke mit der rechten Maustaste auf
VBAProject (DeineDatei.xlsx), wähle Einfügen und dann Modul.
- Deklariere die Funktionen:
Option Explicit
Private Declare PtrSafe Function SendMessageA Lib "user32.dll" ( _
ByVal hwnd As LongPtr, _
ByVal wMsg As Long, _
ByVal wParam As LongPtr, _
ByVal lParam As Any) As LongPtr
Private Declare PtrSafe Function FindWindowA Lib "user32.dll" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As LongPtr
- Verwende die Funktionen in einem Sub: Hier ein Beispiel, wie du die Funktion verwenden kannst:
Private Const WM_SETICON As Long = &H80
Private Const GC_CLASSNAMEMSUSERFORM As String = "ThunderDFrame"
Private Sub UserForm_Initialize()
Dim lngptrFormHandle As LongPtr
lngptrFormHandle = FindWindowA(GC_CLASSNAMEMSUSERFORM, Caption)
Call SendMessageA(lngptrFormHandle, WM_SETICON, 0, Image1.Picture.Handle)
End Sub
Häufige Fehler und Lösungen
- Fehlende Deklaration von LongPtr: Stelle sicher, dass du
LongPtr anstelle von Long verwendest, da dies für die 64-Bit-Version erforderlich ist.
- Falscher Bildtyp: Das Bild, das du verwendest, muss vom Typ
.ico sein. Überprüfe, ob das Bild in den Eigenschaften des Controls korrekt gesetzt ist.
- SendMessage gibt nur ein "Nicht gefunden" Symbol zurück: Überprüfe die Klassennamen und die Fensterbezeichnung, um sicherzustellen, dass sie korrekt sind.
Alternative Methoden
Falls die oben genannten Methoden nicht funktionieren, kannst du auch die FindWindowEx Funktion verwenden. Diese bietet mehr Flexibilität, um Fensterhandle zu finden:
Private Declare PtrSafe Function FindWindowEx Lib "user32.dll" ( _
ByVal hwndParent As LongPtr, _
ByVal hwndChildAfter As LongPtr, _
ByVal lpszClass As String, _
ByVal lpszWindow As String) As LongPtr
Praktische Beispiele
Hier ist ein vollständiges Beispiel für ein UserForm, das ein Icon in der Titelleiste anzeigt:
Option Explicit
Private Declare PtrSafe Function SendMessageA Lib "user32.dll" ( _
ByVal hwnd As LongPtr, _
ByVal wMsg As Long, _
ByVal wParam As LongPtr, _
ByVal lParam As Any) As LongPtr
Private Declare PtrSafe Function FindWindowA Lib "user32.dll" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As LongPtr
Private Const WM_SETICON As Long = &H80
Private Const GC_CLASSNAMEMSUSERFORM As String = "ThunderDFrame"
Private Sub UserForm_Initialize()
Dim lngptrFormHandle As LongPtr
lngptrFormHandle = FindWindowA(GC_CLASSNAMEMSUSERFORM, Caption)
Call SendMessageA(lngptrFormHandle, WM_SETICON, 0, Image1.Picture.Handle)
End Sub
Tipps für Profis
- Verwende
PtrSafe in deinen Deklarationen, um sicherzustellen, dass dein Code sowohl in 32-Bit als auch in 64-Bit Umgebungen funktioniert.
- Überprüfe die API-Dokumentation für die
user32.dll, um weitere nützliche Funktionen zu entdecken, die du in deinem VBA-Projekt verwenden kannst.
- Halte deine VBA-Projekte gut dokumentiert, insbesondere wenn du mit externen Bibliotheken arbeitest.
FAQ: Häufige Fragen
1. Warum muss ich LongPtr verwenden?
LongPtr ist notwendig, um die Speichermanagement-Unterschiede zwischen 32-Bit und 64-Bit Versionen von Windows zu berücksichtigen.
2. Kann ich den Code in einer 32-Bit Excel-Version verwenden?
Ja, aber du musst die PtrSafe-Deklaration entfernen und Long anstelle von LongPtr verwenden.
3. Woher bekomme ich die Icons für mein UserForm?
Icons können aus verschiedenen Quellen bezogen werden, achte darauf, dass sie im .ico Format vorliegen, um korrekt angezeigt zu werden.