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

MsgBox - Position verändern

Forumthread: MsgBox - Position verändern

MsgBox - Position verändern
29.08.2017 11:56:22
STeve
Begrüße alle fleißigen und so hilfreichen Forumsteilnehmer recht herzlich.
Eine komplizierte BITTE an euch:
Benötige diesmal eine Zusammenführung von zwei fertigen Codes!!!
Dank (Piet) habe ich in folgender Datei den "SUCHE"-Button (befindet sich nur auf Blatt 1 (TWG) - sucht aber alle drei Blätter durch)optimieren können.
https://www.herber.de/bbs/user/115857.xls
Jeder Treffer wird grell grün eingefärbt. Bei "weitersuchen" nimmt die Zelle wieder die ursprüngliche Formatierung an und der nächste Treffer wird so grell angezeigt usw.
Die Start-Eingabe-Inputbox konnte ich leicht re. oben positionieren.
Aber die ausgegebenen MsgBoxen "weitersuchen/ja/nein" schlagen aber natürlich immer in der Mitte der Datei auf.
Bei Suche einer Straße liegt somit der gefundene Treffer immer hinter der Msgbox. Diese Box muss erst mit der Maus zur Seite gezogen werden damit man den Treffer sehen kann.
In folgender Datei (natürlich nicht von mir) kann ich über Eingabe von Werten in den Zellen B4 und B5 die x und y Position der MsgBox leicht vorgeben.
https://www.herber.de/bbs/user/115858.xlsm
Frage/Bitte:
Ist es möglich den Code der

Msgbox-Positionierungs-Datei

in die
"SUCHE"-Button-Datei
einzuarbeiten.
Besten Dank und wünsche inzwischen schönen Tag.
mfg STeve
Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: MsgBox - Position verändern
29.08.2017 12:17:03
Nepumuk
Hallo Steve,
ein Beispiel zu basteln:
Option Explicit

Private Declare PtrSafe Function FindWindowA Lib "user32.dll" ( _
    ByVal lpClassName As String, _
    ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function SetTimer Lib "user32.dll" ( _
    ByVal hwnd As LongPtr, _
    ByVal nIDEvent As LongPtr, _
    ByVal uElapse As Long, _
    ByVal lpTimerFunc As LongPtr) As LongPtr
Private Declare PtrSafe Function KillTimer Lib "user32.dll" ( _
    ByVal hwnd As LongPtr, _
    ByVal nIDEvent As LongPtr) As Long
Private Declare PtrSafe Function SetWindowPos Lib "user32.dll" ( _
    ByVal hwnd As LongPtr, _
    ByVal hWndInsertAfter As LongPtr, _
    ByVal x As Long, _
    ByVal y As Long, _
    ByVal cx As Long, _
    ByVal cy As Long, _
    ByVal wFlags As Long) As Long

Private Const GC_CLASSNAMEMSDIALOG = "#32770"

Private Const SWP_NOSIZE = &H1&
Private Const SWP_NOZORDER = &H4&

Private Const BOX_TITLE = "Information"

Public Sub prcShowBox2()
    Call SetTimer(Application.hwnd, 0, 10, AddressOf prcTimer)
    Call MsgBox("Hallo, da bin ich", vbInformation, BOX_TITLE)
End Sub

Private Sub prcTimer(ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr, _
        ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr)

    Call prcKillTimer
    Call prcSetWindowPos
End Sub

Private Sub prcKillTimer()
    Call KillTimer(Application.hwnd, 0)
End Sub

Private Sub prcSetWindowPos()
    Const POS_X As Long = 200&
    Const POS_Y As Long = 320&
    Dim lngptrBoxHwnd As Long
    lngptrBoxHwnd = FindWindowA(GC_CLASSNAMEMSDIALOG, BOX_TITLE)
    If lngptrBoxHwnd <> 0 Then
        Call SetWindowPos(lngptrBoxHwnd, 0, POS_X, POS_Y, 0&, 0&, _
            SWP_NOSIZE Or SWP_NOZORDER)
    End If
End Sub

Gruß
Nepumuk
Anzeige
AW: MsgBox - Position verändern
29.08.2017 12:42:30
STeve
Hi lieber Nepumuk......du überschätzt mich leicht. Hahahaha aber danke für dein Vertrauen.
Brauche noch Hilfe!!!
Habe deinen Code:
Public Sub prcShowBox2()....in ein Blatt eingefügt (dort einen cmd Button zum aufrufen erstellt) ...
...und die restlichen Codes in ein leeres Modul.
Frage 1 : ist das richtig?
...weil....
Frage 2:
Bei Klick auf den cmd- Button kommt:
Fehlermeldung: Fehler beim Kompilieren: Sub, Function oder Property erwartet ....
und
... AddressOf prcTimer ...wird markiert.
Danke und mfg
STeve
Anzeige
AW: MsgBox - Position verändern
29.08.2017 13:12:00
Nepumuk
Hallo Steve,
der gesamte Code gehört in ein Modul.
Gruß
Nepumuk
Probiere mal was in umsetzen kann....Danke
29.08.2017 13:22:38
STeve
Danke Nepumuk......für die schnelle Antwort. In der neu erstellten Datei klappt es natürlich so.
Jetzt werd ich mal basteln ob ich das in der Suchbutton-Datei einpflegen kann.
mfg STeve und noch schönen Tag.
Anzeige
;
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, folge diesen Schritten:

  1. Öffne den VBA-Editor: Drücke Alt + F11, um den Visual Basic for Applications (VBA) Editor zu öffnen.

  2. Erstelle ein neues Modul: Klicke im Menü auf Einfügen und wähle Modul.

  3. Füge den folgenden Code ein:

    Option Explicit
    
    Private Declare PtrSafe Function FindWindowA Lib "user32.dll" ( _
        ByVal lpClassName As String, _
        ByVal lpWindowName As String) As LongPtr
    
    Private Declare PtrSafe Function SetWindowPos Lib "user32.dll" ( _
        ByVal hwnd As LongPtr, _
        ByVal hWndInsertAfter As LongPtr, _
        ByVal x As Long, _
        ByVal y As Long, _
        ByVal cx As Long, _
        ByVal cy As Long, _
        ByVal wFlags As Long) As Long
    
    Private Const SWP_NOSIZE As Long = &H1
    Private Const SWP_NOZORDER As Long = &H4
    
    Public Sub ShowCustomMsgBox()
        Dim boxTitle As String
        boxTitle = "Information"
    
        ' Anzeige der MsgBox
        MsgBox "Hallo, da bin ich", vbInformation, boxTitle
    
        ' Positioniere die MsgBox
        Dim hwnd As LongPtr
        hwnd = FindWindowA("#32770", boxTitle)
        If hwnd <> 0 Then
            SetWindowPos hwnd, 0, 200, 320, 0, 0, SWP_NOSIZE Or SWP_NOZORDER
        End If
    End Sub
  4. Rufe die Subroutine auf: Erstelle einen Button auf einem Excel-Blatt und verlinke ihn mit der ShowCustomMsgBox Subroutine.

  5. Teste die Funktion: Klicke auf den Button, um die MsgBox anzuzeigen und ihre Position festzulegen.


Häufige Fehler und Lösungen

  • Fehlermeldung: "Fehler beim Kompilieren: Sub, Function oder Property erwartet"
    Dieser Fehler tritt auf, wenn der AddressOf Befehl in einer Subroutine verwendet wird, die nicht als Public deklariert ist. Stelle sicher, dass alle Subs korrekt deklariert sind.

  • MsgBox wird nicht an der richtigen Position angezeigt
    Überprüfe, ob der Titel der MsgBox korrekt angegeben ist. Der Titel muss mit dem in FindWindowA übereinstimmen.


Alternative Methoden

Eine alternative Methode zur Positionierung von MsgBoxen könnte die Verwendung von UserForms sein. UserForms bieten mehr Flexibilität in Bezug auf Design und Positionierung. Du kannst Controls hinzufügen, um eine benutzerdefinierte Benutzeroberfläche zu gestalten.


Praktische Beispiele

  • Beispiel 1: Einfache MsgBox mit benutzerdefinierter Position:

    Public Sub CustomMessage()
        MsgBox "Dies ist eine benutzerdefinierte MsgBox", vbInformation, "Benutzerdefiniert"
    End Sub
  • Beispiel 2: MsgBox mit dynamischer Position:

    Public Sub DynamicPositionMsgBox()
        Dim xPos As Long, yPos As Long
        xPos = Application.Width / 2
        yPos = Application.Height / 2
    
        MsgBox "Dynamisch positioniert", vbInformation, "Dynamisch"
        SetWindowPos FindWindowA("#32770", "Dynamisch"), 0, xPos, yPos, 0, 0, SWP_NOSIZE Or SWP_NOZORDER
    End Sub

Tipps für Profis

  • Verwende Constants: Definiere Positionskonstanten, um die Wartbarkeit deines Codes zu erhöhen.

  • Debugging: Nutze Debug.Print um die Fensterhandles zu überprüfen, falls die MsgBox nicht korrekt positioniert wird.

  • Erweiterung: Integriere die MsgBox-Positionierung in größere Automatisierungsprojekte, um die Benutzererfahrung zu verbessern.


FAQ: Häufige Fragen

1. Kann ich die MsgBox in einer bestimmten Excel-Version nicht verwenden?
Die beschriebenen Methoden sind mit Excel Versionen ab 2010 und höher kompatibel.

2. Ist es möglich, die MsgBox mit anderen Excel-Elementen zu kombinieren?
Ja, du kannst die MsgBox-Positionierung in Kombination mit anderen Funktionen wie InputBox oder UserForms verwenden, um interaktive Benutzeroberflächen zu erstellen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige