素のVBAだけで画面の解像度を取得というか推測する手法(API使いません)
VBAで画面の解像度を取得したいときにWeb検索すると、WindowsAPIを使うとか、PowerShell経由で.NET APIを使うとかいう記事がよく出てきますが、結構面倒なイメージがあります。ここでは、そういうものを使わずにVBAだけで画面の解像度を取得というか推測する手法を紹介します。
Excelにおけるポイントという単位とは?
Excelを使っているとよく出てくる単位に「ポイント (Point, pt)」というものがあります。これはExcel (Office)の中で使われる独自の単位で擬似的なピクセルのようなもので、フォントサイズのことではありません。
詳しいことは以下のブログを参考にして下さい。
vbabeginner.net
重要なことは、ポイントとピクセル(画面の解像度で使用する単位)には以下の関係性があるということです。
1ピクセル(pixel)=0.75ポイント(pt) つまり 1pt ≒ 1.3333pixel
VBAでウィンドウサイズを取得する
Sub myWindowSize() '==Excelのウィンドウサイズを取得する== Dim myWindowWidth As Long Dim myWindowHeight As Long '**ウィンドウサイズを取得する myWindowWidth = Application.Width myWindowHeight = Application.Height MsgBox "ウィンドウ幅=" & myWindowWidth & "(pt)" & vbCrLf & _ "ウィンドウ高=" & myWindowHeight & "(pt)" End Sub
通常(ウィンドウ)モードで最大領域にした場合
適当なExcelブックを開き、最大化ボタンを使わずに手作業で最大領域まで広げて下さい。以下は新規ファイルを最大領域にしたものです。ちなみに筆者のモニタ環境はフルHD(1920pixel×1080pixel)です。
このウィンドウに対し、先ほどのマクロを動かしてみた結果がこちらです。
このサイズはポイント(pt)単位なので、ピクセル(pixel)単位に変換します。
項目 | サイズ(pt) | 1.3333倍して四捨五入(pixel) | タスクバーの高さ(pixel) | 計(pixel) |
---|---|---|---|---|
画面幅 | 1440 | 1920 | - | 1920 |
画面高 | 780 | 1040 | 40 | 1080 |
ウィンドウサイズ(pt単位)から、画面解像度(pixel単位)が取得換算できました。
最大化モードにした場合
それでは通常モードではなく最大化の場合はどうでしょうか。次のコードを追加して最大化します。(普通に最大化してもいいです)
'**ウィンドウを最大化する ActiveWindow.WindowState = xlMaximized
サイズはポイント(pt)単位なので、ピクセル(pixel)単位に変換します。
項目 | サイズ(pt) | 1.3333倍して四捨五入(pixel) | タスクバーの高さ(pixel) | 計(pixel) |
---|---|---|---|---|
画面幅 | 1452 | 1936 | - | 1936 |
画面高 | 792 | 1056 | 40 | 1096 |
項目 | 最大化(pixel) | 画面解像度(pixel) | 差 |
---|---|---|---|
幅 | 1936 | 1920 | 16 |
高 | 1096 | 1080 | 16 |
おそらく、上下左右に 8pixel ずつマージンが取られている……と予測できますね(実際はちょっと違うみたいです)。
そもそも画面の解像度は大体決まっている
そもそもパソコンの画面解像度というのは、いくつかのサイズに決まっていてパソコンのグラフィックチップの性能やモニタの最大解像度で決定しています。
画像解像度の例
名称 | 幅(pixel) | 高(pixel) | 画面比率 |
---|---|---|---|
VGA | 640 | 480 | 4:3 |
XGA | 1024 | 768 | 4:3 |
SXGA | 1280 | 1024 | 5:4 |
UXGA | 1600 | 1200 | 4:3 |
WSXGA+ | 1650 | 1050 | 約16:10 |
WUXGA | 1920 | 1200 | 16:10 |
HD | 1366 | 768 | 16:9 |
FullHD | 1920 | 1080 | 16:9 |
4K | 3840 | 2160 | 16:9 |
結論:目的によってはこの方法でも構わない
上記のように解像度は大体決まっているので、最大化して換算して大体その解像度に近いものが画面解像度になる、というものでも十分だと思います。使用目的、例えば画面解像度にしたがってユーザーフォームの大きさを変えるとか、ウィンドウ位置を制御するとか、そういった目的に使うのであればこの程度の精度の取得でも問題ないのではないでしょうか。
以上。