Vielen Dank im voraus für jede Hilfe!
Lothar
Private Sub Form_Load()
txtPosX = 0
txtPosY = 0
End Sub
Private Sub Command1_Click()
Dim hInst As Long, Thread As Long
Dim msg As String
If Check1.Value = 1 Then
msg$ = "Die MessageBox ist jetzt zentriert."
Else
hInst = App.hInstance
Thread = GetCurrentThreadId()
hHook = SetWindowsHookEx(WH_CBT, AddressOf WinProc, _
hInst, Thread)
posX = CLng(txtPosX)
posY = CLng(txtPosY)
msg$ = "Die Position der MessageBox ist an:" & _
vbCrLf & vbCrLf & "X-Position: " & posX & vbCrLf & _
"Y-Position: " & posY
End If
MsgBox msg$, vbOKOnly + vbInformation, _
"Position der MessageBox", 0, 0
End Sub
Private Sub Command1_Click()' wird bei mir aus einer Userform aufgerufen. Dabei ist zu beachten, daß der Code unmittelbar vor dem Aufruf der MsgBox eingefügt wird. Andernfalls kann es sein, daß das komplette Excel-Fenster verschoben wird. Anbei die Korrektur.
Nochmals tausend Dank. Du hast mir sehr weitergeholfen.
Gruß
Lothar
Private Sub Command1_Click()
Dim hInst As Long, Thread As Long
Dim msg As String
' If Check1.Value = 1 Then
' msg$ = "Die MessageBox ist jetzt zentriert."
' Else
hInst = Application.Hinstance
Thread = GetCurrentThreadId()
hHook = SetWindowsHookEx(WH_CBT, AddressOf WinProc, _
hInst, Thread)
posX = CLng(50) 'in Klammer X-Koordinate eingeben
posY = CLng(350) 'in Klammer Y-Koordinate eingeben
msg$ = "Die Position der MessageBox ist an:" & _
vbCrLf & vbCrLf & "X-Position: " & posX & vbCrLf & _
"Y-Position: " & posY
' End If
MsgBox msg$, vbOKOnly + vbInformation, _
"Position der MessageBox", 0, 0
End Sub
Um die Position einer MsgBox in Excel VBA zu ändern, musst du API-Calls verwenden. Hier ist eine Schritt-für-Schritt-Anleitung:
Öffne den VBA-Editor: Drücke ALT + F11
in Excel, um den VBA-Editor zu öffnen.
Füge ein Modul hinzu: Klicke mit der rechten Maustaste auf "VBAProject (DeineDatei.xlsx)" und wähle Einfügen > Modul
.
Kopiere den folgenden Code in das Modul:
Option Explicit
Public Declare Function SetWindowPos Lib "user32" _
(ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _
ByVal x As Long, ByVal y As Long, ByVal cx As Long, _
ByVal cy As Long, ByVal wFlags As Long) As Long
Public Declare Function SetWindowsHookEx Lib "user32" Alias _
"SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, _
ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Public Declare Function UnhookWindowsHookEx Lib "user32" _
(ByVal hHook As Long) As Long
Public Declare Function GetCurrentThreadId Lib "kernel32" () As Long
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 posX As Long
Public posY As Long
Public Function WinProc(ByVal lMsg As Long, ByVal wParam As Long, _
ByVal lParam As Long) As Long
If lMsg = HCBT_ACTIVATE Then
SetWindowPos wParam, 0, posX, posY, 0, 0, SWP_NOSIZE Or _
SWP_NOZORDER Or SWP_NOACTIVATE
UnhookWindowsHookEx hHook
End If
WinProc = False
End Function
Erstelle ein UserForm: Füge ein neues UserForm hinzu (Rechtsklick auf "VBAProject" > Einfügen > UserForm
).
Füge Steuerelemente hinzu: Füge zwei TextBoxen für die X- und Y-Position sowie einen Button hinzu, um die MsgBox anzuzeigen.
Füge den folgenden Code in das UserForm ein:
Private Sub Command1_Click()
Dim hInst As Long, Thread As Long
Dim msg As String
hInst = Application.Hinstance
Thread = GetCurrentThreadId()
hHook = SetWindowsHookEx(WH_CBT, AddressOf WinProc, hInst, Thread)
posX = CLng(txtPosX) ' X-Koordinate eingeben
posY = CLng(txtPosY) ' Y-Koordinate eingeben
msg = "Die Position der MessageBox ist an:" & vbCrLf & _
"X-Position: " & posX & vbCrLf & _
"Y-Position: " & posY
MsgBox msg, vbOKOnly + vbInformation, "Position der MessageBox", 0, 0
End Sub
Testen: Starte die UserForm und gib die gewünschten Koordinaten für die MsgBox ein.
Fehler: Variablen nicht gefunden
Lösung: Stelle sicher, dass die Variablen Check1
, txtPosX
, txtPosY
korrekt benannt sind und im UserForm existieren.
Fehler: MsgBox wird nicht an der gewünschten Position angezeigt
Lösung: Überprüfe, ob der Code zur Positionierung direkt vor dem MsgBox-Aufruf steht. Andernfalls kann es sein, dass die Excel-Anwendung verschoben wird.
Wenn du eine einfachere Lösung suchst, kannst du stattdessen ein UserForm verwenden, das mehr Flexibilität bietet. UserForms können einfacher positioniert und gestaltet werden, ohne auf API-Calls zurückgreifen zu müssen.
posX
und posY
auf die Mitte des Bildschirms fest. posX = (Application.Width / 2) - (MsgBoxWidth / 2)
posY = (Application.Height / 2) - (MsgBoxHeight / 2)
1. Kann ich die Position einer MsgBox in allen Excel-Versionen ändern?
Ja, die API-Methoden funktionieren in den meisten Excel-Versionen, die VBA unterstützen.
2. Was passiert, wenn ich die Koordinaten außerhalb des Bildschirms setze?
Die MsgBox wird möglicherweise nicht angezeigt oder an einer unerwarteten Position erscheinen. Achte darauf, die Koordinaten innerhalb des Sichtbereichs deines Bildschirms zu setzen.
Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden
Suche nach den besten AntwortenEntdecke unsere meistgeklickten Beiträge in der Google Suche
Top 100 Threads jetzt ansehen