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

Forumthread: UserForm Bildschirmskalierung anpassen

UserForm Bildschirmskalierung anpassen
17.04.2023 14:09:00
Max Remmert

Guten Tag zusammen,

Ich erstelle zurzeit ein Expertensystem für die Auswahl von geeigneten Packmitteln für bestimmte Gefahrenstoffe. Damit die Stammdaten des Systems einfach gepflegt werden können erfolgt die Dateneingabe in Excel - die Daten werden anschließend automatisiert exportiert. Für den Benutzer werden Eingabemasken als EXCEL-User-Form zur Verfügung gestellt. Die Darstellung des User-Forms soll nun auf jeglichen Rechnern, unabhängig von Bildschirmauflösung und Skalierung identisch dargestellt werden.

Problem: Ändert man in den Windows-Anzeigeeinstellungen (siehe "Screenshot1_Anzeigeeinstellungen") die Skalierung (z.B. von 100% auf 125%), wird das USER-Form anschließend völlig verzerrt dargestellt (siehe "Screenshot2_verzerrte_Darstellung"). Gibt es eine Möglichkeit bei Start der Excel-Datei, die Skalierung abzufragen und das User-Form automatisch anzupassen, sodass es immer korrekt dargestellt wird (siehe "Screenshot3_korrekte_Darstellung")?

Eine ähnliche Lösung gibt es für die Bildschirmauflösung (siehe: https://www.excel-inside.de/beispiele_vba/vba-userforms/318-userform-anhand-der-bildschirmaufloesung-zoomen), jedoch nicht für den Skalierungsfaktor. Ich bin über jeden Lösungsvorschlag und Ideen dankbar!

Screenshots: https://www.herber.de/bbs/user/158753.zip

Vielen Dank und beste Grüße,

Max

Anzeige

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: UserForm Bildschirmskalierung anpassen
17.04.2023 14:39:32
Nepumuk
Hallo Max,

teste mal (im Modul des Userforms):

Option Explicit

Private Declare PtrSafe Function GetSystemMetrics Lib "user32.dll" ( _
    ByVal nIndex As Long) As Long
Private Declare PtrSafe Function GetDesktopWindow Lib "user32.dll" () 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 Const SM_CXSCREEN As Long = 0&
Private Const SM_CYSCREEN As Long = 1&
Private Const LOGPIXELS_X As Long = 88&
Private Const LOGPIXELS_Y As Long = 90&

Private Sub UserForm_Activate()

    Dim sngWidth As Single, sngHeight As Single

    sngWidth = Width
    sngHeight = Height

    Left = 0
    Top = 0

    Width = GetSystemMetrics(SM_CXSCREEN) * GetResolution(LOGPIXELS_X)
    Height = GetSystemMetrics(SM_CYSCREEN) * GetResolution(LOGPIXELS_Y)

    Zoom = Fix(Application.Min(Width / sngWidth, Height / sngHeight) * 100)

End Sub

Private Function GetResolution(ByVal pvlngLogPixel As Long) As Single

    Dim lngptrhWndDesk As LongPtr, lngptrhDCDesk As LongPtr
    Dim lnglogPixel As Long

    lngptrhWndDesk = GetDesktopWindow()
    lngptrhDCDesk = GetDC(lngptrhWndDesk)

    lnglogPixel = GetDeviceCaps(lngptrhDCDesk, pvlngLogPixel)

    Call ReleaseDC(lngptrhWndDesk, lngptrhDCDesk)

    GetResolution = 72 / lnglogPixel

End Function
Gruß
Nepumuk


Anzeige
AW: UserForm Bildschirmskalierung anpassen
17.04.2023 15:11:31
MaxR
Danke Nepumuk,

der Ansatz ist schon einmal sehr gut und hilft mir auf jeden Fall erstmal weiter. Das User-Form ist zwar weiterhin verzerrt, jedoch besteht kein Unterschied mehr zwischen unterschiedlichen Bildschirmskalierungen. Erster Erfolg!

Jedoch kommt es noch nicht zum gewünschten Effekt. Die Steuerelement und der Hintergrund sind nicht übereinander und das Fenster des User-Forms hat nicht die gewünschte Größe (wie vorgegeben). Siehe:

Userbild

Ich bastel mal selber weiter, bin jedoch für alle weiteren Vorschläge und Ideen zur Lösung dankbar!

Gruß,

Max


Anzeige
AW: UserForm Bildschirmskalierung anpassen
17.04.2023 18:08:06
Oberschlumpf
na, Max, ne EXCEL-Bsp-Datei mit Userform(s), und nich nur Bilddateien könnte dazu beitragen, mehr und/oder schneller weitere, mögliche Antworten zu erhalten
...mit Excel-Dateien kann man nämlich besser (mit)testen als mit JPG-Dateien


AW: UserForm Bildschirmskalierung anpassen
18.04.2023 08:27:34
MaxR
Hallo Oberschlumpf,

ich gebe Dir recht. Ich habe die Datei bisher nicht hochgeladen, da sie sensible Daten enthält. Hier aber eine Dummy-Version mit dem entsprechenden User-Form zum rumprobieren erstellt: https://www.herber.de/bbs/user/158766.xlsm

Weiterhin bitte ich im Lösungsvorschläge! Danke an die Community.


Anzeige
AW: UserForm Bildschirmskalierung anpassen
18.04.2023 09:26:26
Oberschlumpf
Hi Max,

danke für die Datei!
Nun muss ich sagen, dass zumindest ich leider nicht weiterhelfen kann.

Wenn ich die Datei nutze, funktioniert immer alles.
Nix vom Userform wird verzehrt oder sonst irgendwie falsch dargestellt.
Ok, getestet hab ich nur mit unterschiedlichen Zoom-Werten der Excel-Datei, eine/mehrere andere Bildschirmauflösung(en) hab ich nicht getestet.
Aber du hattest ja auch selbst geschrieben, dass das Problem "nur noch" bei Änderung von Zoom in Excel passiert.

DASS bei mir kein Fehler auftritt, liegt daran, denke ich, weil ich nur einen Monitor nutze.

Ich bin sicher, es wird hier Helfer geben, die mindestens n 2. Monitor auf ihrem Schreibtisch stehen haben :-)

Weiter viel Erfolg!

Ciao
Thorsten


Anzeige
AW: UserForm Bildschirmskalierung anpassen
18.04.2023 11:17:14
MaxR
Hallo Thorsten,

trotzdem danke dass Du mit gedacht hast. Sorry falls mich falsch ausgedrückt habe, aber ich beziehe mich nicht auf die Zoom-Funktion in Excel! Die Verzerrung tritt auf, wenn in den Windows Anzeigeeinstellungen (Einstellungen-->System-->Bildschirm-->"Skalierung und Anordnung"), der Skalierungsfaktor verändert wird (z.B. von 100% auf 150%). Der Effekt wird erst nach dem Neustart von Excel sichtbar. Ein Problem bei unterschiedlichen Bildschirmauflösungen tritt nicht auf.

Ich konnte das Problem bereits auf mehreren Rechner reproduzieren, jedoch nicht lösen...


Anzeige
AW: UserForm Bildschirmskalierung anpassen
18.04.2023 16:53:50
Oberschlumpf
Hi Max,

sorry, war doch eher mein Fehler, dass wir aneinander vorbei geredet haben.
Ich hatte deine erste, durchaus richtige Beschreibung, leider erst mal falsch verstanden.
(hierzu trotzdem n Tipp: bei neuen/weiteren Fragen versuch nicht, einen Bearbeitungsweg zu UMschreiben sondern schreib jeden einzelnen, oder die wichtigsten Schritte auf, was du tust, damit etwas bestimmtes passiert..oder ähnlich)

Und ja, jetzt, wenn ich über den von dir beschriebenen Weg die Bildschirm!!!! - nicht Excel-Skalierung ändere und das Userform starte, sehe auch ich die Verzerrungen trotz Verwendung von nur 1 Monitor.

Gegoogelt nach Lösung hab ich (auch), aber gefunden hab ich...nix :-/

Ciao
Thorsten

Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

UserForm Bildschirmskalierung anpassen


Schritt-für-Schritt-Anleitung

Um die Skalierung eines Excel-UserForms unabhängig von den Windows-Anzeigeeinstellungen anzupassen, folge diesen Schritten:

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

  2. Erstelle ein neues Modul: Klicke mit der rechten Maustaste auf dein Projekt und wähle Einfügen > Modul.

  3. Füge den folgenden Code ein:

    Option Explicit
    
    Private Declare PtrSafe Function GetSystemMetrics Lib "user32.dll" ( _
       ByVal nIndex As Long) As Long
    Private Declare PtrSafe Function GetDesktopWindow Lib "user32.dll" () 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 Const SM_CXSCREEN As Long = 0
    Private Const SM_CYSCREEN As Long = 1
    Private Const LOGPIXELS_X As Long = 88
    Private Const LOGPIXELS_Y As Long = 90
    
    Private Sub UserForm_Activate()
       Dim sngWidth As Single, sngHeight As Single
       sngWidth = Width
       sngHeight = Height
       Left = 0
       Top = 0
       Width = GetSystemMetrics(SM_CXSCREEN) * GetResolution(LOGPIXELS_X)
       Height = GetSystemMetrics(SM_CYSCREEN) * GetResolution(LOGPIXELS_Y)
       Zoom = Fix(Application.Min(Width / sngWidth, Height / sngHeight) * 100)
    End Sub
    
    Private Function GetResolution(ByVal pvlngLogPixel As Long) As Single
       Dim lngptrhWndDesk As LongPtr, lngptrhDCDesk As LongPtr
       Dim lnglogPixel As Long
       lngptrhWndDesk = GetDesktopWindow()
       lngptrhDCDesk = GetDC(lngptrhWndDesk)
       lnglogPixel = GetDeviceCaps(lngptrhDCDesk, pvlngLogPixel)
       Call ReleaseDC(lngptrhWndDesk, lngptrhDCDesk)
       GetResolution = 72 / lnglogPixel
    End Function
  4. Teste das UserForm: Speichere deine Änderungen und teste das UserForm, um zu sehen, ob die Anpassungen erfolgreich waren.


Häufige Fehler und Lösungen

  • Problem: UserForm wird verzerrt dargestellt.

    • Lösung: Stelle sicher, dass der gesamte Code korrekt eingefügt wurde und keine Zeilen fehlen. Überprüfe auch die Skalierungseinstellungen in Windows und teste die Lösung auf verschiedenen Monitoren.
  • Problem: Steuerelemente sind nicht richtig ausgerichtet.

    • Lösung: Vergewissere dich, dass die Steuerelemente des UserForms die richtigen Anker- und Größenparameter haben. Überprüfe die Eigenschaften der Steuerelemente im VBA-Editor.

Alternative Methoden

Falls der obige VBA-Code nicht die gewünschten Ergebnisse liefert, kannst du auch die Excel-Anzeigeeinstellungen manuell anpassen:

  1. Gehe zu Einstellungen > System > Anzeige.
  2. Stelle den Skalierungsfaktor für den Bildschirm ein.
  3. Teste danach dein UserForm, um die Auswirkungen der Änderungen zu sehen.

Zusätzlich kannst du auch verschiedene Zoom-Einstellungen in Excel ausprobieren, um die Darstellung zu verbessern.


Praktische Beispiele

Ein Beispiel für die Anwendung des Codes könnte wie folgt aussehen: Wenn du ein UserForm für die Dateneingabe in einem Expertensystem erstellst, kannst du die Größe des Formulars anhand der Bildschirmauflösung und der Skalierung automatisch anpassen.

Hier ist ein einfacher Anwendungsfall:

  • Erstelle ein UserForm mit Textfeldern und Buttons für die Dateneingabe.
  • Implementiere den oben genannten VBA-Code, um die Darstellung zu optimieren.

Tipps für Profis

  • Verwende dynamische Layouts: Nutze die Eigenschaften der Steuerelemente, um ein flexibles Layout zu erstellen, das sich an verschiedene Bildschirmgrößen anpasst.
  • Teste auf verschiedenen Monitoren: Stelle sicher, dass das UserForm auf unterschiedlichen Bildschirmen und mit verschiedenen Excel-Anzeigeeinstellungen gut aussieht.
  • Dokumentiere den Code: Füge Kommentare in deinen VBA-Code ein, damit andere (oder du selbst in der Zukunft) schnell verstehen können, was jeder Teil des Codes bewirken soll.

FAQ: Häufige Fragen

1. Warum wird mein UserForm nach der Anpassung immer noch verzerrt?
Es könnte sein, dass einige Steuerelemente nicht korrekt ausgerichtet sind oder dass der Code nicht vollständig implementiert wurde.

2. Welche Excel-Version benötige ich für diese Lösung?
Der bereitgestellte VBA-Code ist mit Excel 2010 und höher kompatibel. Stelle sicher, dass du eine 64-Bit-Version von Excel verwendest, wenn du den PtrSafe-Schlüsselwort benötigst.

3. Kann ich auch Excel VBA Kalender in UserForms integrieren?
Ja, du kannst zusätzliche Steuerelemente wie Kalendersteuerungen in dein UserForm einfügen, um die Dateneingabe zu erleichtern. Achte darauf, dass die Skalierung ebenfalls für diese Steuerelemente angepasst wird.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige