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.