Userforms platzieren bei 2 Monitoren

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
Bild

Betrifft: Userforms platzieren bei 2 Monitoren
von: Hendrik
Geschrieben am: 04.06.2015 10:50:29

Hallo zusammen,
ich habe zwei Bildschirme im Parallelbetrieb und das Problem, dass - unabhängig davon ob Excel rechts oder links im Vollbild läuft - neu angezeigte Userforms stets in der Mitte, also auf der Kante beider Bildschirme landen. Kann man das ändern/beeinflussen?
Danke und Grüße
Hendrik

Bild

Betrifft: AW: Userforms platzieren bei 2 Monitoren
von: Nepumuk
Geschrieben am: 04.06.2015 11:25:55
Hallo,
ändere mal in den Eigenschaften die Option StartUpPosition auf 1-Fenstermitte
Gruß
Nepumuk

Bild

Betrifft: AW: Userforms platzieren bei 2 Monitoren
von: Nepumuk
Geschrieben am: 04.06.2015 12:13:17
Hallo,
das klappt auch nicht. Mist !!!
Ändere die StartUpPosition auf 0-Manuell und kopiere folgenden Code in das Modul des UserForms:

Private Sub UserForm_Initialize()
    With Application
        Left = .Left + .Width / 2 - Width / 2
        Top = .Top + .Height / 2 - Height / 2
    End With
End Sub

Gruß
Nepumuk

Bild

Betrifft: AW: Userforms platzieren bei 2 Monitoren
von: Hendrik
Geschrieben am: 08.06.2015 09:57:56
Danke für den Vorschlag, Nepumuk.
Jetzt ist der Dialog zwar auf dem gleichen Bildschirm wie die Excel-Instanz, aber noch immer nicht in dessen Mitte. Er hängt direkt am Rand zum zweiten Bildschirm.
Grüße

Bild

Betrifft: AW: Userforms platzieren bei 2 Monitoren
von: Nepumuk
Geschrieben am: 08.06.2015 10:11:55
Hallo,
hast du Excel auf zwei Bildschirme verteilt?
Gruß
Nepumuk

Bild

Betrifft: AW: Userforms platzieren bei 2 Monitoren
von: Hendrik
Geschrieben am: 08.06.2015 12:26:43
Nö. Wenn ich Excel beispielsweise im Vollbild rechts habe, dann erscheinen Dialogboxen standardmäßig am rechten Rand des linken Monitors. Durch Deine Codezeilen sind sie jetzt am linken Rand des rechten Monitors. Aber am liebsten wäre mir die Mitte des rechten Monitors. :)

Bild

Betrifft: AW: Userforms platzieren bei 2 Monitoren
von: Nepumuk
Geschrieben am: 08.06.2015 12:34:06
Hallo,
dann teste mal folgendes.
In einem Standardmodul:

Option Explicit

Private Declare Function EnumDisplayMonitors Lib "user32.dll" ( _
    ByVal hdc As Long, _
    ByRef lprcClip As Any, _
    ByVal lpfnEnum As Long, _
    ByVal dwData As Long) As Long
Private Declare Function GetMonitorInfoA Lib "user32.dll" ( _
    ByVal hMonitor As Long, _
    ByRef lpmi As MONITORINFO) As Long
Private Declare Function MonitorFromWindow Lib "user32.dll" ( _
    ByVal hwnd As Long, _
    ByVal dwFlags As Long) As Long

Private Type RECT
    lngLeft As Long
    lngTop As Long
    lngRight As Long
    lngBottom As Long
End Type

Private Type MONITORINFO
    cbSize As Long
    rcMonitor As RECT
    rcWork As RECT
    dwFlags As Long
End Type

Private Const MONITOR_DEFAULTTONEAREST = &H2

Private ludtRect As RECT

Public Sub MoveUserform(ByRef probjUserform As Object)
    Dim udtDeleteRect As RECT
    Call EnumDisplayMonitors(ByVal 0&, ByVal 0&, AddressOf Read_Monitor, ByVal 0&)
    With probjUserform
        Call .Move((ludtRect.lngLeft - (ludtRect.lngRight) * -1) * 0.75 / 2 - .Width / 2 _
            , ludtRect.lngBottom * 0.75 / 2 - .Height / 2)
    End With
End Sub

Private Function Read_Monitor( _
        ByVal pvlngMonitor As Long, _
        ByVal pvlngHdcMonitor As Long, _
        ByRef prudtlprcMonitor As RECT, _
        ByVal pvlngdwData As Long) As Long

    Dim udtMonitorInfo As MONITORINFO
    udtMonitorInfo.cbSize = Len(udtMonitorInfo)
    Call GetMonitorInfoA(pvlngMonitor, udtMonitorInfo)
    If MonitorFromWindow(Application.hwnd, MONITOR_DEFAULTTONEAREST) = pvlngMonitor Then
        ludtRect = udtMonitorInfo.rcWork
        Read_Monitor = 0
    Else
        Read_Monitor = 1
    End If
End Function

Im Modul des UserForms:
Private Sub UserForm_Initialize()
    Call MoveUserform(Me)
End Sub

Gruß
Nepumuk

 Bild

Beiträge aus den Excel-Beispielen zum Thema "Userforms platzieren bei 2 Monitoren"