none
Wie stelle ich per Excel-VBA die gerade aktuelle Monitorauflösung in dpi fest? RRS feed

  • Frage

  • Liebe Foristen,

    vom MVC Communitymoderator Ingo Böttcher wurde ich gebeten, meine Frage hier zu wiederholen:

    mein künftiger VBA-Code sollte in der Lage sein, individuelle Bildschirmauflösungen in dpi zu ermitteln und auf dem Schirm darstellen. Es soll ein Code werden, den wechselnde Mitarbeiter an verschiedenen Rechnerstationen mit unterschiedlichen Betriebssystemen und Excel-Versionen einsetzen werden.

    Die jeweilige Windows-Version kann ich mit dem Application Objekt  Application.OperatingSystem, die entsprechende Excel-Variante unter Application.Version ermitteln. Ein ähnlicher Zugriff fehlt mir für den jeweils angeschlossenen Bildschirm. Hat jemand einen Tipp??

    Viele Grüße von Rick81son

    Samstag, 3. Februar 2018 17:52

Alle Antworten

  • Hi, die Auflösung des Monitors (PPI) wird in Pixeln angegeben, die Auflösung des Druckers in Dots per Inch (DPI).

    Die Auflösung im Pixeln kannst du relativ einfach ermitteln:

    Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
    Private Const SM_CXSCREEN = 0
    Private Const SM_CYSCREEN = 1
    
    Public Sub GetScreenResolution()
      MsgBox "Bildschirmauflösung: " & _
      GetSystemMetrics(SM_CXSCREEN) & "x" & GetSystemMetrics(SM_CYSCREEN)
    End Sub

    Gruß, Stefan


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    Samstag, 3. Februar 2018 18:27
  • Hi Stefan,

    recht herzlichen Dank für deine Lösung, will ich gleich morgen früh mal probieren.

    Bezügl. Monitor in ppi und Printer in dpi ist das eigentlich bei mir auch Stand meines Wissens. Nur die Microsoft-Direkthilfe aus dem Objektkatalog heraus spricht unter dem Titel DPI- und geräteunabhängige Pixel von Bildschirmpixeln. Ich verstehe den Begriff DPI (Device Independent Pixel) als die von Windows gesetzten 4 Standards für Monitore (96, 120, 144 und 192dpi), unabhängig von ihrer tatsächlichen Auflösung. Insofern habe ich, wie Windows auch, den Auflösungsbegriff dpi beibehalten.

    Mein Monitor, mit dem ich diese Zeilen schreibe, ist von Windows in DPI=120dpi eingruppiert, die reale Auflösung, um die es eigentlich geht, hat 142dpi (oder besser: 142ppi). Dafür hoffe ich, kann ich deine Lösung verwenden.

    Vielen Dank im Voraus für deine Mühe, ich melde mich zeitnah. Gruß von Ganzon-Rick81son

    (Link MS-Online-Hilfe):

    https://msdn.microsoft.com/de-de/library/windows/desktop/ff684173(v=vs.85).aspx

    Samstag, 3. Februar 2018 22:41
  • Hi, die Auflösung des Monitors (PPI) wird in Pixeln angegeben, die Auflösung des Druckers in Dots per Inch (DPI).

    Die Auflösung im Pixeln kannst du relativ einfach ermitteln:

    Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
    Private Const SM_CXSCREEN = 0
    Private Const SM_CYSCREEN = 1
    
    Public Sub GetScreenResolution()
      MsgBox "Bildschirmauflösung: " & _
      GetSystemMetrics(SM_CXSCREEN) & "x" & GetSystemMetrics(SM_CYSCREEN)
    End Sub

    Gruß, Stefan


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    Hallo Stefan,

    ja danke noch einmal für deine Mühe. Leider hakt es bei mir im VBA-Run offenbar schon in der ersten Zeile, denn es meldet sich die MS-Info:

    Fehler beim Kompilieren

    Sub oder Function nicht definiert

    Die erste GetSystemMetrics-Anweisung ist dabei blau gekennzeichnet. Da ich Schreibfehler ausschliessen kann, vermute ich, dass bei mir die angesprochene Lib "user32" nicht zugriffsfähig ist. Bin völlig neu im Umgang tiefer gehender Codierung, so auch die Tatsache, dass alle Private-Anweisungen dort oben stehen, wo ich üblicherweise Option Explicit stehen habe. In (Deklarationen) steht nun GetScreenResolution. (zwischen Public Const SM_CYSCREEN = 1 und Public Sub GetScreenResolution() verläuft die Trennlinie)

    Soweit auch aus deiner Sicht ok?

    Grüsse von Ganzon-Rick81son

    Sonntag, 4. Februar 2018 12:41
  • Hmm.. bei mir sieht das so aus:

    Einfach in ein Modul gepackt sollte es laufen..


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    Sonntag, 4. Februar 2018 15:41
  • Hallo Stefan,

    ja, genauso sieht's bei mir auch aus. Vielleicht liegt es bei mir an der Modul-Verbindung.

    Ich versuche es noch einmal mit anderen Modulen. Jetzt weiß ich, das es vom Code her richtig ist. Sollte ich auf andere Hindernisse stossen, melde ich mich noch einmal. Ansonsten wird's wohl klappen.

    Dir schon mal jetzt vielen Dank für deinen Tipp und für deine schnelle Reaktion! Die finale Info erhälst du auf alle Fälle von mir.

    Viele Grüsse von Ganzon-Rick81son

    Sonntag, 4. Februar 2018 16:39
  • Hallo Stefan,

    mit einem anderen Modul hat''s geklappt! Nochmals danke für Alles, Stefan!

    Ein herzlicher Gruss von Ganzon-Rick81son

    Sonntag, 4. Februar 2018 20:48