はじめに
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_CXSCREEN
と SM_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
を渡せば画面の高さがピクセル単位で返される。
このテクニックを使えば、ユーザーの画面サイズを考慮した、よりユーザーフレンドリーなユーザーフォームのレイアウト制御などが可能になります。