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.