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

Userform an Mausposition öffnen

Forumthread: Userform an Mausposition öffnen

Userform an Mausposition öffnen
05.09.2019 12:08:30
Julius
Hallo zusammen,
ich hab da mal wieder ein Problem, bei dem ich nicht weiter komme.
Ich möchte eine Userform an der Position öffnen, an der der Mauszeiger ist.
Das habe ich bereits:
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" ( _
ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function SetWindowPos Lib "user32" ( _
ByVal hwnd As Long, ByVal hWndInsertAfter As LongPtr, _
ByVal X As Long, ByVal Y As Long, ByVal cx As LongPtr, _
ByVal cy As Long, ByVal wFlags As Long) As LongPtr
Private Declare PtrSafe Function GetCursorPos Lib "user32" ( _
lpPoint As POINTAPI) As LongPtr
Private Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOZORDER = &H4
Private Const SWP_NOREDRAW = &H8
Private Const SWP_NOACTIVATE = &H10
Private Const SWP_FRAMECHANGED = &H20
Private Const SWP_SHOWWINDOW = &H40
Private Const SWP_HIDEWINDOW = &H80
Private Const SWP_NOCOPYBITS = &H100
Private Const SWP_NOOWNERZORDER = &H200
Private Const SWP_NOREPOSITION = SWP_NOOWNERZORDER
Private Const SWP_DRAWFRAME = SWP_FRAMECHANGED
Private Type POINTAPI
X As Long
Y As Long
End Type
Und:
Private Sub UserForm_Activate()
Dim Mausposition As POINTAPI
Dim hwnd&
hwnd = FindWindow(vbNullString, Me.Caption)
GetCursorPos Mausposition
SetWindowPos hwnd, 0, Mausposition.X, Mausposition.Y, 0, 0, _
SWP_NOACTIVATE Or SWP_NOZORDER Or SWP_FRAMECHANGED Or SWP_NOSIZE
Die Userform wird über einen Comandbutton aufgerufen. Da der Button in einer Hauptuserform mehrmals an verschiedenen Stellen zur Datumsübergabe benutzt wird, möcht eich das auch die secundäre Userform sich in der nähe des gedrückten Buttons öffnen. Hier denke ich ist die Mausposition die beste Wahl.
Aber leider bekomme ich den Fehler das FindWindow falsch deklariert ist bzw der Typ falsch ist.
Ich musste den mit PtrSafe und LongPtr umstellen damit er auf 32/64bit Systemen läuft.
Wo liegt denn der Fehler den ich nicht sehe? :D
Vielen DAnk
Anzeige

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Userform an Mausposition öffnen
05.09.2019 13:12:32
Daniel
HI
wenn sich der Button in einer Userform befindet, kannst du Position des Mauszeigers auch über folgende Kette ermitteln, ohne über die Windows-API zu gehen:
1. Position der Hauptuserform +
2. Position des Buttons innerhalb der Userform +
3. Position des Mauszeigers über dem Button bei Klick.
für 1. und 2 nimmst du die .Top und .Left-Werte des Buttons und der Userform
3. kannst du im MouseUp-Event des Buttons abfragen über die Variablen X und Y, wobei X = Left und Y = Top ist)
dann alle 3 Werte zusammen addieren und ggf einen Korrekturwert für Rahmenbreite und Überschrift hinzufügen.
Gruß Daniel
Anzeige
AW: Userform an Mausposition öffnen
05.09.2019 14:17:04
Julius
Cool ich danke dir, das versuche ich mal. Auf diesen Weg bin ich gar nicht gekommen.
Aber ich verstehe nicht, wo der Fehler in dem Code liegt, mit dem ich es versucht habe. Ich hatte auch versucht die Variable mit einem anderen Datentypen zu tauschen. Das ging aber auch nicht.
AW: Userform an Mausposition öffnen
05.09.2019 15:16:11
Julius
Okay, bevor ich den zweiten Weg angehe, wollte ich dennoch einmal schauen warum das mit der API nicht geht. Mir sind noch ein paar Fehler aufgefallen. Soweit funktioniert es auch, jedoch öffnet sich die Userfrm nicht an der Position des Mauszeigers sondern Mittig am oberen Bildschirmrand. ^^
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" ( _
ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function SetWindowPos Lib "user32" ( _
ByVal hwnd As LongPtr, ByVal hWndInsertAfter As LongPtr, _
ByVal X As LongPtr, ByVal Y As LongPtr, ByVal cx As LongPtr, _
ByVal cy As LongPtr, ByVal wFlags As LongPtr) As LongPtr
Private Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As LongPtr
Private Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOZORDER = &H4
Private Const SWP_NOREDRAW = &H8
Private Const SWP_NOACTIVATE = &H10
Private Const SWP_FRAMECHANGED = &H20
Private Const SWP_SHOWWINDOW = &H40
Private Const SWP_HIDEWINDOW = &H80
Private Const SWP_NOCOPYBITS = &H100
Private Const SWP_NOOWNERZORDER = &H200
Private Const SWP_NOREPOSITION = SWP_NOOWNERZORDER
Private Const SWP_DRAWFRAME = SWP_FRAMECHANGED
Private Type POINTAPI
X As LongPtr ' vergessen X & Y auch als LongPtr zu setzen
Y As LongPtr
End Type


Dim Mausposition As POINTAPI
Dim hwnd As LongPtr ' hier hatte ich auch noch einen Fehler in der Declaration
hwnd = FindWindow(vbNullString, Me.Caption)
GetCursorPos Mausposition
SetWindowPos hwnd, 0, Mausposition.X, Mausposition.Y, 0, 0, _
SWP_NOACTIVATE Or SWP_NOZORDER Or SWP_FRAMECHANGED Or SWP_NOSIZE

Anzeige
AW: Userform an Mausposition öffnen
05.09.2019 17:47:18
Daniel
HI
das hochladen deiner Datei wäre nicht schlecht.
dann müsste man das nicht nachbauen.
kann ja auch sein, dass der Fehler nicht in dem hier gezeigten Code liegt, sondern an einer anderen Stelle.
Gruß Daniel
AW: Userform an Mausposition öffnen
06.09.2019 09:21:18
Julius
Hallo Daniel,
da hast du natürlich recht ;-)
Ich hab die Funktion einmal in einer Testdatei untergebracht. Da die Original recht Sensible Kundendaten beinhaltet. :)
https://www.herber.de/bbs/user/131877.xlsm
Ich denke das geht auch so. Vielen Dank
Anzeige
AW: Userform an Mausposition öffnen
06.09.2019 10:33:16
Daniel
HI
funktioniert bei mir fehlerfrei.
Gruß Daniel
AW: Userform an Mausposition öffnen
06.09.2019 12:40:37
Julius
Okay, verstehe ich nicht. :D
Es öffnet sich bei dir das Fenster direkt am Mauspoint?
Wieso dann nicht bei mir? Ist das ggf Excel Versions abhängig?
Dann werde ich wohl mal anfangen, das nach deinem Vorschlag umzuschreiben.
Danke dir für deine Zeit :)
Anzeige
AW: Userform an Mausposition öffnen
09.09.2019 15:43:10
Julius
Hallo Daniel,
ja du hast recht. Ich hab die Datei einmal an einem anderen Rechner Probiert und da geht es.
Ganz komisch. Ich denke irgendwo gibt es einen unterschied zwischen den ExcelVersionen.
AW: Userform an Mausposition öffnen
09.09.2019 16:04:33
Daniel
oder den Windowsversionen.
der von mir beschriebene Weg sollte davon unabhängig sein.
Außerdem würde ich auch die Mausposition verwenden, sondern nur die Buttonpostition und die Userform immer an der gleichen Stelle neben dem Button plaztieren, unabhängig davon, wo sich der Mauszeiger beim Klick befand.
Gruß Daniel
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Userform an Mausposition öffnen in Excel VBA


Schritt-für-Schritt-Anleitung

Um eine Userform an der aktuellen Mausposition zu öffnen, kannst du die Windows-API mit Excel VBA nutzen. Hier sind die Schritte:

  1. API-Funktionen deklarieren: Füge die folgenden Deklarationen in dein Modul ein:

    Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" ( _
    ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
    Private Declare PtrSafe Function SetWindowPos Lib "user32" ( _
    ByVal hwnd As LongPtr, ByVal hWndInsertAfter As LongPtr, _
    ByVal X As LongPtr, ByVal Y As LongPtr, ByVal cx As LongPtr, _
    ByVal cy As LongPtr, ByVal wFlags As LongPtr) As LongPtr
    Private Declare PtrSafe Function GetCursorPos Lib "user32" ( _
    lpPoint As POINTAPI) As LongPtr
  2. Konstanten und Datentypen: Definiere die erforderlichen Konstanten und den POINTAPI Datentyp:

    Private Const SWP_NOSIZE = &H1
    Private Const SWP_NOACTIVATE = &H10
    
    Private Type POINTAPI
       X As LongPtr
       Y As LongPtr
    End Type
  3. UserForm öffnen: Verwende den folgenden Code, um die Userform bei Aktivierung an der Mausposition anzuzeigen:

    Private Sub UserForm_Activate()
       Dim Mausposition As POINTAPI
       Dim hwnd As LongPtr
       hwnd = FindWindow(vbNullString, Me.Caption)
       GetCursorPos Mausposition
       SetWindowPos hwnd, 0, Mausposition.X, Mausposition.Y, 0, 0, _
       SWP_NOACTIVATE Or SWP_NOSIZE
    End Sub
  4. Button-Click-Ereignis: Verknüpfe die Userform mit einem CommandButton in der Hauptuserform.


Häufige Fehler und Lösungen

  • Fehlermeldung bei FindWindow: Wenn du eine Fehlermeldung erhältst, stelle sicher, dass du die Deklarationen mit PtrSafe und den richtigen Datentypen (LongPtr) verwendest.

  • Userform öffnet sich nicht an der Mouseposition: Überprüfe, ob der Mauszeiger tatsächlich über dem Button ist, wenn du klickst. Das kann durch die Verwendung von MouseUp-Ereignissen in der Button-Klasse behoben werden.


Alternative Methoden

Wenn die Verwendung der Windows-API nicht funktioniert oder du eine einfachere Lösung möchtest, kannst du die Position des Buttons und der Userform manuell berechnen:

  1. Position des Buttons: Nutze die Eigenschaften .Top und .Left des Buttons.
  2. Korrekturwerte: Addiere ggf. Korrekturwerte für den Rahmen und die Titelleiste der Userform.

Hier ein Beispiel:

Dim buttonPosX As Long
Dim buttonPosY As Long

buttonPosX = CommandButton.Left + Me.Left
buttonPosY = CommandButton.Top + Me.Top

Me.Move buttonPosX, buttonPosY

Praktische Beispiele

Hier ist ein Beispielcode, der die Userform an der Mausposition öffnet, wenn du auf einen Button klickst:

Private Sub CommandButton1_Click()
    UserForm2.Show
End Sub

In der UserForm2 verwendest du die oben beschriebenen API-Funktionen, um sie an der Mausposition anzuzeigen.


Tipps für Profis

  • Fehlerdiagnose: Bei Problemen mit getcursorpos vba, überprüfe die Kompatibilität deiner Excel-Version. Manchmal können Unterschiede zwischen 32-Bit und 64-Bit Excel zu unerwarteten Verhalten führen.

  • Mausposition anzeigen: Du kannst die aktuelle Mausposition auch zur Fehlersuche in einer MsgBox anzeigen lassen, um sicherzustellen, dass du die korrekten Werte erhältst:

    MsgBox "X: " & Mausposition.X & " Y: " & Mausposition.Y

FAQ: Häufige Fragen

1. Warum funktioniert das Öffnen der Userform nicht an der Mausposition? Es kann an der Excel-Version oder an den Deklarationen der API-Funktionen liegen. Stelle sicher, dass du die richtigen Datentypen verwendest.

2. Kann ich die Mausposition auch ohne API ermitteln? Ja, du kannst die Position des Buttons und der Userform verwenden, um sie an einer gewünschten Stelle zu öffnen, ohne die Windows-API zu verwenden.

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