Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

64 bit Declare-Anweisung

Forumthread: 64 bit Declare-Anweisung

64 bit Declare-Anweisung
Michael
Moin Allerseits!
Ich möchte mein Projekt gerne auf ein 64bit-System laufen lassen. Ichhabe mir schon so weit herausgesucht, dass die Declare-Anweisung zu unterteilen ist:
#If Win64 Then
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName _
As String, ByVal lpWindowName As String) As Long
Private Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As _
Long, ByVal nIndex As Long) As Long
Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As _
Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare PtrSafe Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long
#Else
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, _
ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, _
ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long
#End If
Aber nach dem #else steht alles rot da bis zum #EndIf. Wieso denn jetzt? Weiß jemand da warum? Danke für Eure Hilfe.
Gruß
Michael H
Anzeige

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

Betreff
Benutzer
Anzeige
AW: 64 bit Declare-Anweisung
07.12.2011 11:38:59
Nepumuk
Hallo,
das ist normal da der 64Bit Interpreter die 32Bit Declare-Anweisungen nicht verarbeiten kann. Durch die bedingte Kompilierung kann aber nichts passieren.
Woruaf du aber achten musst, GetWindowLong und SetWindowLong können mit 32Bit Excel unter 64Bit Windows zu spontanen Abstürzen führen. Die versuchen nämlich in einen 32Bit breiten Speicherbereich zu lesen und zu schreiben der Speicherbereich ist aber 64Bit breit.
Aus der Hilfe zu den Funktionen:
The GetWindowLong function retrieves information about the specified window. The function also retrieves the 32-bit (long) value at the specified offset into the extra window memory of a window.
The SetWindowLong function changes an attribute of the specified window. The function also sets a 32-bit (long) value at the specified offset into the extra window memory of a window.
Eine Lösung zu diesem Problem gibt es nicht da du in einem 32Bit Excel keine 64Bit Variablen (LongLong) benutzen kannst.
Gruß
Nepumuk
Anzeige
AW: 64 bit Declare-Anweisung
07.12.2011 12:19:32
Michael
Hallo Nepumuk!
Vielen Dank. Der Code läuft tatsächlich so durch.
VG
Michael H
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige

Infobox / Tutorial

64-Bit Declare-Anweisung in Excel VBA


Schritt-für-Schritt-Anleitung

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu starten.

  2. Füge ein neues Modul hinzu, indem du mit der rechten Maustaste auf "VBAProject" klickst und "Einfügen" > "Modul" wählst.

  3. Schreibe den folgenden Code, um die Declare-Anweisung für 64-Bit Systeme einzufügen:

    #If Win64 Then
       Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
       Private Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
       Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
       Private Declare PtrSafe Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long
    #Else
       Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
       Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
       Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
       Private Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long
    #End If
  4. Achte darauf, dass der Code vor der Ausführung gespeichert wird.

  5. Teste die Funktionen, um sicherzustellen, dass sie korrekt funktionieren.


Häufige Fehler und Lösungen

  • Problem: Der Code wird rot markiert.

    • Lösung: Dies passiert, wenn du versuchst, 32-Bit Declare-Anweisungen in einem 64-Bit Kontext zu verwenden. Stelle sicher, dass du die PtrSafe-Anweisung korrekt implementierst.
  • Problem: Abstürze bei Verwendung von GetWindowLong oder SetWindowLong.

    • Lösung: Diese Funktionen können in einer 32-Bit-Version von Excel unter einem 64-Bit Windows-System zu Problemen führen. Verwende stattdessen die LongLong-Datentypen, wo nötig.

Alternative Methoden

Wenn du die Declare-Anweisung in VBA vermeiden möchtest, kannst du auf alternative Methoden zurückgreifen, wie z.B.:

  • Windows API Wrapper: Verwende eine bestehende API-Bibliothek, die die Interaktion mit Windows-Funktionen vereinfacht.
  • Excel-Funktionen: Überprüfe, ob die Funktionalität, die du benötigst, auch direkt über Excel-Funktionen zugänglich ist.

Praktische Beispiele

Hier sind einige nützliche Beispiele für die Verwendung der FindWindow-Funktion:

  1. Fenster finden:

    Dim hwnd As Long
    hwnd = FindWindow("Notepad", vbNullString)
    If hwnd <> 0 Then
       MsgBox "Notepad gefunden!"
    Else
       MsgBox "Notepad nicht gefunden!"
    End If
  2. Fensterattribute ändern:

    Dim result As Long
    result = SetWindowLong(hwnd, GWL_STYLE, WS_MINIMIZE)

Diese Beispiele zeigen, wie die private declare function findwindow lib user32 64 bit in der Praxis eingesetzt werden kann.


Tipps für Profis

  • Verwende Option Explicit: Setze Option Explicit am Anfang deines Moduls, um sicherzustellen, dass alle Variablen deklariert werden. Dies hilft, Fehler frühzeitig zu erkennen.
  • Fehlerbehandlung: Implementiere eine Fehlerbehandlung, um Abstürze in deinem VBA-Code zu vermeiden, insbesondere bei der Verwendung von Windows API-Funktionen.
  • Dokumentation: Halte deine Declare-Anweisungen und deren Verwendung gut dokumentiert, um die Wartung des Codes zu erleichtern.

FAQ: Häufige Fragen

1. Was ist der Unterschied zwischen 32-Bit und 64-Bit in VBA?
Der Hauptunterschied liegt in der Speicherkapazität. 64-Bit-Versionen können mehr RAM nutzen und ermöglichen die Verwendung von LongLong-Variablen, was in der 32-Bit-Version nicht möglich ist.

2. Kann ich 64-Bit Funktionen in 32-Bit Excel verwenden?
Nein, die 64-Bit Declare-Anweisungen sind nicht mit 32-Bit Excel kompatibel. Du musst separate Anweisungen für beide Versionen implementieren.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige