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

Forumthread: Userform auf zweitem Bildschirm mittig

Userform auf zweitem Bildschirm mittig
01.11.2021 14:14:30
SteffenS
Hallo Zusammen,
ich habe folgenden Code gefunden, um eine Userform innerhalb des Excel-Fensters zu zentrieren.
With UF
.Top = Application.Top + (Application.Height - .Height) / 2
.Left = Application.Left + (Application.Width - .Width) / 2
End With
Auf dem ersten Bildschirm funktioniert dies auch super.
Verschiebe ich Excel nun auf den zweiten (rechten) Bildschirm so ist die UF am linken Bildschirmrand.
Was kann ich tun, damit die UF unabhängig vom Monitor immer mittig ist?
Danke Euch schon mal.
VG Steffen
Anzeige

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Userform auf zweitem Bildschirm mittig
01.11.2021 14:20:32
Andreas
Probier mal das im Userform Initalize
'Userform wegen 2. Bildschirm immer mittig positionieren
Dim objApp As Object
Set objApp = ThisWorkbook.Windows.Application
With objApp
Me.Left = .Left + 100
End With
AW: Userform auf zweitem Bildschirm mittig
01.11.2021 14:42:50
Nepumuk
Hallo Steffen,
im Modul des UserForms:

Private Sub UserForm_Initialize()
Call MoveUserform(Me)
End Sub
In einem Standardmodul:

Option Explicit
Private Declare PtrSafe Function EnumDisplayMonitors Lib "user32.dll" ( _
ByVal hdc As LongPtr, _
ByRef lprcClip As LongPtr, _
ByVal lpfnEnum As LongPtr, _
ByVal dwData As Long) As Long
Private Declare PtrSafe Function GetMonitorInfoA Lib "user32.dll" ( _
ByVal hMonitor As LongPtr, _
ByRef lpmi As MONITORINFO) As Long
Private Declare PtrSafe Function MonitorFromWindow Lib "user32.dll" ( _
ByVal hwnd As LongPtr, _
ByVal dwFlags As Long) As LongPtr
Private Declare PtrSafe Function GetDC Lib "user32.dll" ( _
ByVal hwnd As LongPtr) As LongPtr
Private Declare PtrSafe Function ReleaseDC Lib "user32.dll" ( _
ByVal hwnd As LongPtr, _
ByVal hdc As LongPtr) As Long
Private Declare PtrSafe Function GetDeviceCaps Lib "gdi32.dll" ( _
ByVal hdc As LongPtr, _
ByVal nIndex 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 HWND_DESKTOP As LongPtr = 0
Private Const LOGPIXELSX As Long = 88&
Private Const LOGPIXELSY As Long = 90&
Private Const MONITOR_DEFAULTTONEAREST As Long = &H2
Private ludtRect As RECT
Public Sub MoveUserform(ByRef probjUserform As Object)
Dim sngDPI As Single
sngDPI = GetDPI
Call EnumDisplayMonitors(ByVal 0, ByVal 0, AddressOf Read_Monitor, ByVal 0&)
With probjUserform
Call .Move((ludtRect.lngLeft + ludtRect.lngRight) * sngDPI / 2 - .Width / 2 _
, (ludtRect.lngBottom + ludtRect.lngTop) * sngDPI / 2 - .Height / 2)
End With
End Sub
Private Function Read_Monitor( _
ByVal pvlngptrMonitor As LongPtr, _
ByVal pvlngptrHdcMonitor As LongPtr, _
ByRef prudtlprcMonitor As RECT, _
ByVal pvlngdwData As Long) As Long
Dim udtMonitorInfo As MONITORINFO
udtMonitorInfo.cbSize = Len(udtMonitorInfo)
Call GetMonitorInfoA(pvlngptrMonitor, udtMonitorInfo)
If MonitorFromWindow(Application.hwnd, MONITOR_DEFAULTTONEAREST) = pvlngptrMonitor Then
ludtRect = udtMonitorInfo.rcWork
Read_Monitor = 0
Else
Read_Monitor = 1
End If
End Function
Private Function GetDPI() As Single
Dim lngptrDevieCaps As LongPtr
lngptrDevieCaps = GetDC(HWND_DESKTOP)
If lngptrDevieCaps  0 Then
GetDPI = 72 / ((GetDeviceCaps(lngptrDevieCaps, LOGPIXELSX) + GetDeviceCaps(lngptrDevieCaps, LOGPIXELSY)) / 2)
Call ReleaseDC(HWND_DESKTOP, lngptrDevieCaps)
End If
End Function
Gruß
Nepumuk
Anzeige
AW: Userform auf zweitem Bildschirm mittig
01.11.2021 21:16:36
SteffenS
Hi,
danke für den umfangreichen Code. :-)
Ich habe diesen mal integriert aber leider ist das Ergebnis das Gleiche.
Monitor 1 ist OK, Monitor 2 UF wird ganz links ausgerichtet.
Habt ihr noch eine Idee?
LG Steffen
AW: Userform auf zweitem Bildschirm mittig
01.11.2021 21:37:28
Nepumuk
Hallo Steffen,
kann ich nicht nachvollziehen. Bei mir wird das UserForm auf dem Bildschirm mittig angezeigt auf dem sich Excel befindet.
Bei mir ist in den Einstellungen - System - Anzeige - Mehrere Bildschirme "Diese Anzeigen erweitern" eingestellt.
Gruß
Nepumuk
Anzeige
AW: Userform auf zweitem Bildschirm mittig
02.11.2021 11:11:49
SteffenS
Hallo,
ich habe das ganze jetzt nochmal auf einem anderen Arbeitsplatz getestet und hier ist das Verhalten gleich.
Auf dem zweiten Bildschirm steht die UF immer ganz links.
In den Einstellung ist ebenfalls "Diese Anzeige erweitern" eingestellt.
Habt ihr noch eine Idee
VG Steffen
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Userform auf zwei Bildschirmen mittig positionieren


Schritt-für-Schritt-Anleitung

Um deine Userform auf dem zweiten Bildschirm mittig zu positionieren, kannst du folgenden VBA-Code verwenden. Dieser Code sollte im Initialisierungsbereich der Userform eingefügt werden:

Private Sub UserForm_Initialize()
    Call MoveUserform(Me)
End Sub

Zusätzlich benötigst du einen Code in einem Standardmodul, um die Position zu bestimmen:

Option Explicit
Private Declare PtrSafe Function EnumDisplayMonitors Lib "user32.dll" ( _
    ByVal hdc As LongPtr, _
    ByRef lprcClip As LongPtr, _
    ByVal lpfnEnum As LongPtr, _
    ByVal dwData As Long) As Long

Private Declare PtrSafe Function GetMonitorInfoA Lib "user32.dll" ( _
    ByVal hMonitor As LongPtr, _
    ByRef lpmi As MONITORINFO) As Long

Private Declare PtrSafe Function MonitorFromWindow Lib "user32.dll" ( _
    ByVal hwnd As LongPtr, _
    ByVal dwFlags As Long) As LongPtr

Private Declare PtrSafe Function GetDC Lib "user32.dll" ( _
    ByVal hwnd As LongPtr) As LongPtr

Private Declare PtrSafe Function ReleaseDC Lib "user32.dll" ( _
    ByVal hwnd As LongPtr, _
    ByVal hdc As LongPtr) As Long

Private Declare PtrSafe Function GetDeviceCaps Lib "gdi32.dll" ( _
    ByVal hdc As LongPtr, _
    ByVal nIndex 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 HWND_DESKTOP As LongPtr = 0
Private Const LOGPIXELSX As Long = 88&
Private Const LOGPIXELSY As Long = 90&
Private Const MONITOR_DEFAULTTONEAREST As Long = &H2

Private ludtRect As RECT

Public Sub MoveUserform(ByRef probjUserform As Object)
    Dim sngDPI As Single
    sngDPI = GetDPI
    Call EnumDisplayMonitors(ByVal 0, ByVal 0, AddressOf Read_Monitor, ByVal 0&)
    With probjUserform
        Call .Move((ludtRect.lngLeft + ludtRect.lngRight) * sngDPI / 2 - .Width / 2, _
                   (ludtRect.lngBottom + ludtRect.lngTop) * sngDPI / 2 - .Height / 2)
    End With
End Sub

Private Function Read_Monitor( _
    ByVal pvlngptrMonitor As LongPtr, _
    ByVal pvlngptrHdcMonitor As LongPtr, _
    ByRef prudtlprcMonitor As RECT, _
    ByVal pvlngdwData As Long) As Long
    Dim udtMonitorInfo As MONITORINFO
    udtMonitorInfo.cbSize = Len(udtMonitorInfo)
    Call GetMonitorInfoA(pvlngptrMonitor, udtMonitorInfo)
    If MonitorFromWindow(Application.hwnd, MONITOR_DEFAULTTONEAREST) = pvlngptrMonitor Then
        ludtRect = udtMonitorInfo.rcWork
        Read_Monitor = 0
    Else
        Read_Monitor = 1
    End If
End Function

Private Function GetDPI() As Single
    Dim lngptrDevieCaps As LongPtr
    lngptrDevieCaps = GetDC(HWND_DESKTOP)
    If lngptrDevieCaps <> 0 Then
        GetDPI = 72 / ((GetDeviceCaps(lngptrDevieCaps, LOGPIXELSX) + GetDeviceCaps(lngptrDevieCaps, LOGPIXELSY)) / 2)
        Call ReleaseDC(HWND_DESKTOP, lngptrDevieCaps)
    End If
End Function

Mit diesem Code sollte deine Userform nun sowohl auf dem ersten als auch auf dem zweiten Bildschirm mittig positioniert werden.


Häufige Fehler und Lösungen

  • Userform wird nicht mittig positioniert:

    • Überprüfe, ob die Funktion MoveUserform korrekt aufgerufen wird.
    • Stelle sicher, dass Excel als Anwendung auf dem zweiten Monitor angezeigt wird und nicht nur das Fenster.
  • Userform bleibt links ausgerichtet:

    • Achte darauf, dass die Anzeigeeinstellungen auf "Diese Anzeige erweitern" eingestellt sind. Dies findest du in den Windows Anzeigeeinstellungen.

Alternative Methoden

Eine alternative Methode, um eine Excel-Datei auf zwei Bildschirmen anzuzeigen, ist das Öffnen von Excel zweimal. Du kannst dies tun, indem du eine neue Instanz von Excel startest:

  1. Öffne Excel über das Startmenü oder die Verknüpfung.
  2. Klicke mit der rechten Maustaste auf das Excel-Symbol in der Taskleiste und wähle "Excel" erneut aus.
  3. Nun kannst du zwei separate Excel-Fenster auf zwei Bildschirmen anzeigen.

Praktische Beispiele

Wenn du ein Excel-Tabellenblatt auf dem zweiten Bildschirm anzeigen möchtest, kannst du die oben genannten VBA-Skripte verwenden. Hier ein Beispiel:

  1. Erstelle ein neues UserForm.
  2. Füge die oben genannten Codes in das UserForm und ein Standardmodul ein.
  3. Starte die Excel-Anwendung und ziehe das Fenster auf den zweiten Bildschirm.
  4. Die Userform wird nun korrekt positioniert, egal auf welchem Bildschirm sich Excel befindet.

Tipps für Profis

  • Nutze die vba application.left-Eigenschaft, um die Position von Excel-Fenstern dynamisch zu steuern.
  • Experimentiere mit verschiedenen DPI-Einstellungen, um die beste Darstellung auf hochauflösenden Bildschirmen zu erreichen.
  • Wenn du regelmäßig mit mehreren Bildschirmen arbeitest, erwäge den Einsatz von Makros zur automatischen Anpassung der Userform-Positionierung.

FAQ: Häufige Fragen

1. Warum wird meine Userform auf dem zweiten Bildschirm nicht mittig angezeigt?
Die Positionierung könnte durch die Anzeigeeinstellungen deines Windows-Betriebssystems beeinträchtigt werden. Stelle sicher, dass "Diese Anzeigen erweitern" aktiviert ist.

2. Kann ich mehrere Excel-Dateien auf zwei Bildschirmen gleichzeitig anzeigen?
Ja, du kannst Excel zweimal öffnen, indem du die Anwendung erneut über die Taskleiste startest. Dadurch kannst du zwei separate Fenster auf unterschiedlichen Bildschirmen haben.

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