Verschiedene Anwendungszwecke machen es erforderlich, dass man ein Formular an einer bestimmten Position öffnet. Und selbst wenn es an sich nicht erforderlich ist, steigert es doch die Ergonomie, wenn zum Beispiel ein Popup-Formular an der Stelle erscheint, an der man den Befehl zum Öffnen betätigt hat – beispielsweise durch einen Klick auf eine Schaltfläche oder auf ein anderes Steuerelement. In diesem Beitrag schauen wir uns an, wie wir unabhängig von anderen Elementen ein Formular öffnen und an der Position des Mauszeiters positionieren können. Dazu benötigen wir nichts außer ein paar Ereignisprozeduren und API-Funktionen.
Ausgangsposition
Angenommen, wir wollen ein Popupformular (oder auch ein normales Formular) an der Stelle öffnen, an der sich gerade der Mauszeiger befindet. Das ist sinnvoll, denn wer möchte schon weite Wege mit der Maus zurücklegen, wenn er das zu öffnende Element direkt an der Mausposition anzeigen kann? Standardmäßig haben wir die Möglichkeit, für das Popup-Formular die Eigenschaft Automatisch zentrieren auf Ja einzustellen, dann würde das neue Formular zumindest in der Mitte des Access-Fensters geöffnet werden. Ansonsten könnten wir mit DoCmd.MoveSize arbeiten, aber dies verwendet Koordinaten, die innerhalb des Access-Fensters liegen und die wir zuerst auch ermitteln müssen.
Ziel dieses Beitrags
Am Ende wollen wir eine Lösung haben, mit der wir von einem Formular aus ein weiteres Formular per Mausklick öffnen können. Dabei soll die linke, obere Ecke des geöffneten Formulars sich an der Position des Mauszeigers befinden. Dies könnte ungefähr wie in Bild 1 aussehen.

Bild 1: Öffnen eines Formulars an der Mausposition
Lösung per API
Also nutzen wir API-Funktionen: Damit können wir nicht nur sehr schnell die aktuelle Position des Mauszeigers ermitteln, sondern auch noch mit einem Befehl die neue Position festlegen. Dazu benötigen wir die folgenden Elemente, zuerst einen Type namens RECT, der die vier Eigenschaften Left, Top, Right und Bottom enthält. Wenn wir eine API-Funktion beispielsweise zum Ermitteln der aktuellen Position und Größe eines Fensters nutzen, liefert diese immer ein solches Konstrukt mit den entsprechenden Werten zurück:
Public Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type
Daneben benötigen wir zum Ermitteln der Koordinaten eines Punktes wie zum Beispiel für die Position des Mauszeigers einen Type mit dem folgenden Aufbau:
Private Type POINTAPI X As Long Y As Long End Type
Diese beiden Typen deklarieren wir öffentlich zugänglich in einem Modul namens mdlAPI.
Außerdem legen wir dort die drei API-Funktionen aus Listing 1 an. Diese sind bereits für die 64-Bit-Version von Office ausgelegt. Die API-Funktionen haben die folgende Funktion:
Public Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long Public Declare PtrSafe Function GetWindowRect Lib "user32" (ByVal hwnd As LongPtr, lpRect As RECT) As Long Public Declare PtrSafe Function MoveWindow Lib "user32" (ByVal hwnd As LongPtr, ByVal x As Long, ByVal y As Long, _ ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long
Listing 1: Die benötigten API-Funktionen
- GetCursorPos: Ermittelt die aktuelle Position des Mauszeigers und schreibt diese in die Eigenschaften X und Y eines POINTAPI-Types.
- GetWindowRect: Ermittelt die Position und Größe eines Fensters, das mit dem Handle hwnd referenziert wird und schreibt diese Informationen in einen RECT-Typ.
- MoveWindow: Erlaubt das Einstellen der Position und der Größe des mit hwnd referenzierten Fensters. x und y nehmen die Koordinaten der linken, oberen Ecke entgegen und nWidth und nHeight die Höhe und die Breite. Der letzte Parameter bRepaint legt fest, ob das Fenster neu gezeichnet werden soll.
Neben diesen Elementen deklarieren wir im Modul mdlAPI noch die folgenden beiden Variablen:
Public lngX As Long Public lngY As Long
Diese sollen die Position des Mauszeigers beim Aufrufen des zu öffnenden Formulars speichern und im geöffneten Formular zur Abfrage bereitstellen.
Beispiel zum Öffnen des Formulars an der Position des Mauszeigers
Nur für Abonnenten
Ab hier wird’s wirklich spannend – der Rest ist exklusiv für Abonnenten.
Mit dem Abo von Access im Unternehmen bekommst du den kompletten Artikel – inklusive vollständigem Code, Beispieldatenbank und Schritt-für-Schritt-Erklärung.
So sparst du dir stundenlanges Herumprobieren, vermeidest teure Fehler in deiner Access-Anwendung und kannst Lösungen direkt in deinem Unternehmen einsetzen, statt nur darüber zu lesen.
Teste Access im Unternehmen jetzt 4 Wochen lang kostenlos: Voller Zugriff auf alle Artikel, Downloads und Beispieldatenbanken. Kein Risiko – wenn es für dich nicht passt, kündigst du einfach innerhalb der ersten vier Wochen.
Bereits Abonnent? Hier einloggen
Kostenlos & unverbindlich
Oder hast Du eine konkrete Frage zu Deiner eigenen Access-Anwendung?
Vielleicht stellt Deine Anwendung Dich vor eine Herausforderung, zu der Du bisher keine Lösung findest. Schlechte Performance, kein ausreichender Zugriffsschutz, Du bist unsicher über Dein Datenmodell oder Dein Code liefert unerklärliche Fehler?
In unserem kostenlosen Access-Audit schaut sich André Minhorst persönlich gemeinsam mit Dir Deine Lösung per Zoom an – und zeigt Dir, wo Datenmodell, VBA-Code, Ergonomie und Sicherheit Optimierungspotenzial bieten.
Jetzt kostenloses Access-Audit anfordern →