Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Position einer MsgBox ändern

Forumthread: Position einer MsgBox ändern

Position einer MsgBox ändern
12.07.2003 11:20:04
Lothar Ehret
Wie kann ich bei einer MsgBox die Anzeige-Position bestimmen? Top/Left scheint bei einer MsgBox nicht zu funktionieren.
Vielen Dank im voraus für jede Hilfe!
Lothar
Anzeige

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Position einer MsgBox ändern
12.07.2003 12:09:54
Knut
Das geht nur sehr aufwändig über API- Functions.
Bastel dir doch ein userform, das ist flexibler.
Knut

AW: Position einer MsgBox ändern
12.07.2003 14:51:56
Lothar Ehret
Hallo Knut,
danke für die Antwort. Die Idee hatte ich auch schon, es wäre mit einer MsgBox nur insofern einfacher, als daß ich diese unproblematisch innerhalb einer FOR-NETX -Schleife in einem Makro aufrufen kann, welches bereits aus einer Userform heraus aufgerufen wird. Mit der MsgBox soll eigentlich nur abgefragt werden, ob die Schleife (eine Suchroutine innerhalb eines Tabellenbereiches) beendet werden soll. Wenn ich innerhalb dieser Schleife eine weitere Userform aufrufe, muß ich irgendwie von diesem Makro in ein anderes verzweigen (neue Userform) und aus dieser wieder in das alte Makro zurückkehren. Dieses habe ich im Moment noch nicht auf die Reihe gebracht.
Gruß
Lothar

Anzeige
AW: Position einer MsgBox ändern
12.07.2003 23:45:15
NE
Hallo,
versuch' mal folgendes, allerdings weiss ich nicht ob's unter vba läuft,
Code von Detlev Schubert, gefunden unter: www.vb-fun.de
hope it helps
Gruss Nancy
--
'-------------------------- module1.bas -------------------------
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

'------------------------- form1.frm ---------------------------
Option Explicit


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


Anzeige
AW: Position einer MsgBox ändern
13.07.2003 14:18:40
Lothar Ehret
Hallo Nancy,

ich habe Deinen Code probiert. Nach einer kleinen Änderung (die Variablen Check1, txtPosX und txtPosY wurden nicht gefunden; App.hInstance mußte ich durch Application.hInstance ersetzen) funktioniert er jetzt einwandfrei. Der Code in Modul 1 habe ich unverändert übernommen. Der Code von '

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


Anzeige
AW: Position einer MsgBox ändern
13.07.2003 21:25:03
NE
Hallo Lothar,
Danke für die Blumen & das konstruktive Posting möglicher Fehler.
(aber der Code ist really nicht von mir)
Freut' mich aber, wenn es weitergeholfen hat.
Gruss Nancy

AW: Position einer MsgBox ändern
13.07.2003 10:09:00
Lothar Ehret
Hallo Nancy,
vielen Dank für den Code. Wenn ich dazu komme, werde ich es heute Nachmittag gleich mal auschecken.
Gruß
Lothar

Anzeige
;
Anzeige

Infobox / Tutorial

MsgBox Position in Excel VBA Anpassen


Schritt-für-Schritt-Anleitung

Um die Position einer MsgBox in Excel VBA zu ändern, musst du API-Calls verwenden. Hier ist eine Schritt-für-Schritt-Anleitung:

  1. Öffne den VBA-Editor: Drücke ALT + F11 in Excel, um den VBA-Editor zu öffnen.

  2. Füge ein Modul hinzu: Klicke mit der rechten Maustaste auf "VBAProject (DeineDatei.xlsx)" und wähle Einfügen > Modul.

  3. 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
  4. Erstelle ein UserForm: Füge ein neues UserForm hinzu (Rechtsklick auf "VBAProject" > Einfügen > UserForm).

  5. Füge Steuerelemente hinzu: Füge zwei TextBoxen für die X- und Y-Position sowie einen Button hinzu, um die MsgBox anzuzeigen.

  6. 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
  7. Testen: Starte die UserForm und gib die gewünschten Koordinaten für die MsgBox ein.


Häufige Fehler und Lösungen

  • 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.


Alternative Methoden

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.


Praktische Beispiele

  1. Zentrierte MsgBox: Lege posX und posY auf die Mitte des Bildschirms fest.
  2. Eingabefelder: Verwende TextBoxen, um Benutzer die X- und Y-Koordinaten für die MsgBox eingeben zu lassen.
  3. Ereignisse: Binde die MsgBox an bestimmte Ereignisse in deinem Makro.
posX = (Application.Width / 2) - (MsgBoxWidth / 2)
posY = (Application.Height / 2) - (MsgBoxHeight / 2)

Tipps für Profis

  • Nutze die API-Calls nur, wenn es wirklich notwendig ist, da sie die Komplexität deines Codes erhöhen.
  • Halte deinen Code sauber und gut dokumentiert, um Fehler bei der Nutzung der MsgBox-Positionierung zu vermeiden.
  • Teste deinen Code regelmäßig, um sicherzustellen, dass er in verschiedenen Versionen von Excel funktioniert.

FAQ: Häufige Fragen

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.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige