VBA Word UserForm - variable Größen

Hallo,

ihr habt mir in letzter Zeit so viel helfen können, vielleicht fällt euch für mein aktuelles Problem auch was ein!?

Ich habe eine Userform in Word. Bisher war diese für 1024x768 optimiert. Jetzt soll diese auch auf 800x600 dargestellt werden können, dafür ist sie derzeit allerdings zu groß.

Gibt es eine Möglichkeit, die Größe einer Userform inklusive aller Elemente darin (Listboxen und Buttons) variabel zu halten? D.h. abhängig von der Bildschirmauflösung (die Überprüfung habe ich schon) sowas wie eine prozentual verkleinerte Variante zu bekommen?

Folgende Alternativ-Möglichkeiten hätte ich im Zweifelsfall, beide allerdings nicht so dolle …

  1. Zwei unterschiedliche Userformen mit identischen Funktionen. Nur eine davon wird bildschirmabhängig aufgerufen. (sehr hässlich …)
  2. Die gleiche Userform, bildschirmabhängig sind nur die Top- und Leftwerte der enthaltenen Objekte (also der Listboxen und Buttons). Dann sieht es zwar in mind. einer Darstellung wahrscheinlich ein wenig verzerrt aus, aber das wäre nicht weiter dramatisch. Erscheint mir allerdings auch zu kompliziert, da ich dann vermutlich lange rumprobieren müsste, bis es für beide passt …

Vielleicht fällt euch noch was Kreatives ein oder es besteht tatsächlich die gewünschte Möglichkeit oben.

Vielen Dank,
Elisabeth

Ich habe eine Userform in Word. Bisher war diese für 1024x768
optimiert. Jetzt soll diese auch auf 800x600 dargestellt
werden können, dafür ist sie derzeit allerdings zu groß.

Gibt es eine Möglichkeit, die Größe einer Userform inklusive
aller Elemente darin (Listboxen und Buttons) variabel zu
halten? D.h. abhängig von der Bildschirmauflösung (die
Überprüfung habe ich schon) sowas wie eine prozentual
verkleinerte Variante zu bekommen?

Hallo Elisabeth,

zeige mal den Code den du schon hast für „die Überprüfung“

Wie wäre es mit sowas:

Private Sub UserForm\_Initialize()
With Me
 .Top = IIf(Aufloesung = 1, 50, 100)
 .Left = IIf(Aufloesung = 1, 50, 100)
 .Height = IIf(Aufloesung = 1, 300, 400)
 .Width = IIf(Aufloesung = 1, 200, 250)
End With
End Sub

Gruß
Reinhard

Hallo Reinhard,

ich überprüfe zunächst, ob der Bildschirm auf 800x600 eingestellt ist, wenn ja wird die Sub ausgeführt, mit der ich derzeit die Größe anpasse. Habe ich im Netz gefunden, gefällt mir aber nicht wirklich. Wäre im Notfall allerdings OK.

Hier ist der Code, den ich nutze:

Sub Userform\_Activate()
 Dim X As String
 X = ScreenResolution()
 If X = "800x600" Then
 SetDeviceIndependentWindow Me 'aktuelle Funktion, um Bildschirmauflösung anzupassen
 End If
End Sub

Option Explicit
' Bildschirmauflösung, unter der die Userform erstellt wurde
Public Const X\_RESOLUTION = 1280 '640
Public Const Y\_RESOLUTION = 1024 '480

Public Sub SetDeviceIndependentWindow(FormName As Object)
 ' Diese Prozedur passt die Größe und Anordnung einer Userform
 ' an die jeweilige Auflösung an.
 ' Idee und Grundgerüst von Frank Lubitz
 '
 ' Im Prozeduraufruf muss die zu ändernde Userform angegeben werden
 Dim XFactor As Single ' Horizontal resize ratio
 Dim YFactor As Single ' Vertical resize ratio
 Dim X As Integer ' For/Next loop variable
 Dim xPixels As Single
 Dim yPixels As Single
 Dim HeightChange As Long
 Dim WidthChange As Long
 Dim OldHeight As Long
 Dim OldWidth As Long
 Dim ctlControl As Control
 '
 ' Fehlermeldungen abfangen
 On Error GoTo ErrorHandler
 ' Vergrößerungs-/Verkleinerungsfaktor der aktuellen Auflösung
 ' in Bezug auf die ursprünglche Auflösung
 XFactor = System.HorizontalResolution / X\_RESOLUTION
 YFactor = System.VerticalResolution / Y\_RESOLUTION
 ' Keine Neuanordung bei identischer Auflösung
 If XFactor = 1 And YFactor = 1 Then Exit Sub
 ' Alte Einstellungen sichern
 OldHeight = FormName.Height
 OldWidth = FormName.Width
 ' Neue Abmessung der Userform berechnen
 FormName.Height = FormName.Height \* YFactor
 FormName.Width = FormName.Width \* XFactor
 ' Änderungen der Abmessungen
 HeightChange = FormName.Height - OldHeight
 WidthChange = FormName.Width - OldWidth
 ' Userform neu positionieren
 FormName.Left = FormName.Left - WidthChange / 2
 FormName.Top = FormName.Top - HeightChange / 2
 ' Alle Controls durchlaufen und ändern
 For Each ctlControl In FormName.Controls
 Debug.Print ctlControl.name
 If TypeOf ctlControl Is ComboBox Then
 ' If Not a Simple Combo box
 ctlControl.FontSize = ctlControl.FontSize \* XFactor
 If ctlControl.Style 1 Then
 ControlResize3 ctlControl, XFactor, YFactor
 End If
 ElseIf TypeOf ctlControl Is TextBox Then
 ControlResize ctlControl, XFactor, YFactor
 ElseIf TypeOf ctlControl Is Label Then
 ControlResize ctlControl, XFactor, YFactor
 ElseIf TypeOf ctlControl Is CheckBox Then
 ControlResize2 ctlControl, XFactor, YFactor
 ElseIf TypeOf ctlControl Is CommandButton Then
 ControlResize2 ctlControl, XFactor, YFactor
 ElseIf TypeOf ctlControl Is ListBox Then
 ControlResize ctlControl, XFactor, YFactor
 ElseIf TypeOf ctlControl Is Image Then
 ControlResize3 ctlControl, XFactor, YFactor
 ElseIf TypeOf ctlControl Is OptionButton Then
 ControlResize2 ctlControl, XFactor, YFactor
 ElseIf TypeOf ctlControl Is MultiPage Then
 ControlResize2 ctlControl, XFactor, YFactor
 ElseIf TypeOf ctlControl Is ToggleButton Then
 ControlResize2 ctlControl, XFactor, YFactor
 ElseIf TypeOf ctlControl Is SpinButton Then
 ControlResize3 ctlControl, XFactor, YFactor
 ElseIf TypeOf ctlControl Is ScrollBar Then
 ControlResize3 ctlControl, XFactor, YFactor
 Else
 ControlResize2 ctlControl, XFactor, YFactor
 End If
 Next ctlControl
 Exit Sub
ErrorHandler:
 ' try to handle next control
 Resume Next
End Sub
Function ControlResize(Control As Control, XFactor, YFactor)
 With Control
 .FontSize = .FontSize \* XFactor
 .Move .Left \* XFactor, .Top \* YFactor, .Width \* XFactor, .Height \* YFactor
 End With
End Function
Function ControlResize2(Control As Control, XFactor, YFactor)
 With Control
 .Font.Size = .Font.Size \* XFactor
 .Move .Left \* XFactor, .Top \* YFactor, .Width \* XFactor, .Height \* YFactor
 End With
End Function
Function ControlResize3(Control As Control, XFactor, YFactor)
 With Control
 .Move .Left \* XFactor, .Top \* YFactor, .Width \* XFactor, .Height \* YFactor
 End With
End Function

Private Const SM\_CXSCREEN = 0
Private Const SM\_CYSCREEN = 1
Private Declare Function GetSystemMetrics Lib "user32" \_
 (ByVal nIndex As Long) As Long

Public Function ScreenResolution()
 ScreenResolution = GetSystemMetrics(SM\_CXSCREEN) & \_
 "x" & GetSystemMetrics(SM\_CYSCREEN)
End Function

Falls es keine bessere Lösung gibt, wäre die sonst OK, allerdings hätte ich dann gleich noch eine Frage:

Ich möchte für eine Listbox in einer UserForm die Funktionen listbox1_MouseMove und listbox1_Click benutzen. Allerdings bemotzt der das, weil er scheinbar nicht damit leben kann, beide Funktionen gleichzeitig zu haben. Aus Java kenne ich es so, dass ich eben verschiedene Events für ein Objekt nutzen kann und hier sind es ja auch zwei unterschiedliche Ereignisse.

Gibt es dafür vielleicht auch ne Alternative, bzw. was mache ich falsch?

Vielen Dank schon mal,
Elisabeth