MessageBox individuell am Bildschirm positionieren

MessageBoxen standardmäßig in der Bildschirm-Mitte angezeigt. In manchen Fällen mag es sinnvoll erscheinen, die MessageBox an einer anderen Bildschirmposition auszugeben.

Das ist aber gar nicht so einfach. Dies lässt sich nur unter Einbeziehung von Windows-Funktionalitäten lösen.

Erfassen Sie bitte folgenden VBA-Code in einem leeren Code-Modul:

Public Const SWP_NOSIZE = &H1
Public Const SWP_NOZORDER = &H4
Public Const SWP_NOACTIVATE = &H10
Public Const HCBT_ACTIVATE = 5
Public Const WH_CBT = 5
Public hHook As Long
Public MsgBoxPosX As Integer
Public MsgBoxPosY As Integer
Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

Function WinProc(ByVal lMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If lMsg = HCBT_ACTIVATE Then
SetWindowPos wParam, 0, MsgBoxPosX, MsgBoxPosY, 0, 0, SWP_NOSIZE Or SWP_NOZORDER Or SWP_NOACTIVATE
UnhookWindowsHookEx hHook
End If
WinProc = False
End Function


Function msg(msgText As String, msgButton As Long, msgTitel As String, ByVal xPos As Long, ByVal yPos As Long)
'** Dimensionierung der Variablen
Dim hInst As Long
Dim XLInst As Long
Dim Thread As Long

'** Werte übergeben
MsgBoxPosX = xPos
MsgBoxPosY = yPos

XLInst = FindWindow("xlmain", vbNullString)
hInst = GetWindowLong(XLInst, GWL_HINSTANCE)
Thread = GetCurrentThreadId()
hHook = SetWindowsHookEx(WH_CBT, AddressOf WinProc, hInst, Thread)

'** Ausgabe des Messagebox Textes
MsgBox msgText, msgButton, msgTitel, 0, 0
End Function

Dem oben stehenden VBA-Code muss nun beim Aufruf die gewünschte X- und Y-Position zur Anzeige der MessageBox übergeben werden. Zur Vereinfachung kann der X- und Y-Wert direkt im Tabellenblatt angegeben werden, siehe Abbildung1. Damit entfällt die Anpassung des Codes bei Änderung der beiden Werte.

 
Abb. 1

Gestartet wird die Funktion über die Schaltfläche "MessageBox" aufrufen. Damit die Funktion korrekt aufgerufen wird, müssen Sie der Schaltfäche folgenden Code zuweisen.

Sub Aufruf_MsgBox()
'** Dimensionierung der Variablen
Dim x
Dim y

With ActiveSheet
  '** Prüfen, ob gültige X und Y Werte eingetragen wurden
  If IsNumeric(.Range("B4")) And IsNumeric(Range("B5")) Then
    x = .Range("B4").Value
    y = .Range("B5").Value
    dummy = msg("Ich bin positioniert wurden", vbInformation, "Hinweis", x, y)
  Else
    MsgBox "Erfassen Sie bitte gültige numerische X- und Y-Achsen-Werte", vbCritical, "Hinweis"
    .Range("B4").Value = 100
    .Range("B5").Value = 100
  End If
End With
End Sub


Sobald Sie nun auf die Schaltfläche klicken, wird die UserForm nahe am rechten Rand und im oberen Drittel des Fensters ausgegeben, siehe Abbildung 2.


Abb. 2

Die Beispieldatei können Sie über den folgenden Link herunterladen.

 

 

Partnerlinks

Relevante Artikel

Ihre Zufriedenheit ist unser Ziel, deshalb verwenden wir Cookies. Mit diesen ermöglichen wir, dass unsere Webseite zuverlässig und sicher läuft, wir die Performance im Blick behalten und Sie besser ansprechen können. Cookies werden benötigt, damit technisch alles funktioniert und Sie auch externe Inhalte lesen können. Des Weiteren sammeln wir unter anderem Daten über aufgerufene Seiten, getätigte Käufe oder geklickte Buttons, um so unser Angebot an Sie zu Verbessern. Mehr über unsere verwendeten Dienste erfahren Sie unter „Weitere Informationen“. Mit Klick auf „Akzeptieren“ erklären Sie sich mit der Verwendung dieser Dienste einverstanden. Ihre Einwilligung können Sie jederzeit mit Wirkung auf die Zukunft widerrufen oder ändern.