【VBA】画面の解像度(幅と高さ)を取得する方法 (GetSystemMetrics API)

目次

はじめに

VBAでユーザーフォームを作成する際、利用者の画面サイズを考慮して、フォームの表示位置や大きさを最適化したい場合があります。例えば、画面解像度に合わせてフォームを中央に表示したり、ウィンドウが画面からはみ出さないように調整したりするケースです。

このようなPC環境の情報を取得するには、Windows API関数を利用します。画面の解像度(幅と高さ)は、GetSystemMetrics というAPI関数を使うことで、簡単に取得できます。

この記事では、GetSystemMetrics APIを使って、プライマリーモニターの画面解像度をピクセル単位で取得する方法を解説します。


画面解像度を取得するVBAサンプルコード

Declareステートメントや Const は、モジュールの最上部Sub などのプロシージャよりも前)に記述する必要があります。

完成コード

'--- モジュールの最上部にAPI関数と定数を宣言 ---

' 64bit/32bit両対応
#If VBA7 Then
    ' システムの様々な情報を取得するAPI関数
    Private Declare PtrSafe Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
#Else
    Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
#End If

' GetSystemMetricsで使う定数
Private Const SM_CXSCREEN As Long = 0 ' 画面の幅を取得するための定数
Private Const SM_CYSCREEN As Long = 1 ' 画面の高さを取得するための定数


' プライマリーモニターの画面解像度を取得して表示する
Sub GetScreenResolution()
    Dim screenWidth As Long
    Dim screenHeight As Long
    
    '--- API関数を呼び出して、画面の幅と高さを取得 ---
    screenWidth = GetSystemMetrics(SM_CXSCREEN)
    screenHeight = GetSystemMetrics(SM_CYSCREEN)
    
    '--- 結果をメッセージボックスに表示 ---
    MsgBox "画面の解像度:" & vbCrLf & _
           "幅: " & screenWidth & " ピクセル" & vbCrLf & _
           "高さ: " & screenHeight & " ピクセル", _
           vbInformation, "解像度情報"
End Sub

コードの解説

Declare PtrSafe Function GetSystemMetrics ...

Windows APIである GetSystemMetrics 関数をVBAで利用可能にするための宣言です。この関数は、引数として渡す定数によって、様々なシステム情報(マウスボタンの数、スクロールバーの幅など)を取得できます。

Const SM_CXSCREENSM_CYSCREEN

これらは、GetSystemMetrics 関数に「何の情報が欲しいか」を伝えるための定数です。

  • SM_CXSCREEN (値は 0): プライマリーモニターの**画面の幅(X軸)**をピクセル単位で取得します。
  • SM_CYSCREEN (値は 1): プライマリーモニターの**画面の高さ(Y軸)**をピクセル単位で取得します。

ご提示のコードでは、rc2 の取得時にも SM_CXSCREEN が使われていましたが、正しくは高さを取得する SM_CYSCREEN を使う必要があります。

screenWidth = GetSystemMetrics(SM_CXSCREEN)

GetSystemMetrics 関数を呼び出し、引数に SM_CXSCREEN を渡すことで、画面の幅を取得し、変数 screenWidth に格納しています。高さも同様です。


まとめ

今回は、Windows APIの GetSystemMetrics を使って、画面の解像度を取得する方法を解説しました。

  • GetSystemMetrics APIで、様々なシステム情報を取得できる。
  • 引数に SM_CXSCREEN を渡せば画面の幅が、SM_CYSCREEN を渡せば画面の高さがピクセル単位で返される。

このテクニックを使えば、ユーザーの画面サイズを考慮した、よりユーザーフレンドリーなユーザーフォームのレイアウト制御などが可能になります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次