日本語入力ソフトとVBAの覚え書き

・各種日本語入力ソフトの辞書解説 ・ちょっと楽になるExcel VBA集

素のVBAだけで画面の解像度を取得というか推測する手法(API使いません)

f:id:dz_dzone:20170814233145j:plain
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)です。
f:id:dz_dzone:20181205155309j:plain
このウィンドウに対し、先ほどのマクロを動かしてみた結果がこちらです。
f:id:dz_dzone:20181205155401j:plain
このサイズはポイント(pt)単位なので、ピクセル(pixel)単位に変換します。

項目 サイズ(pt) 1.3333倍して四捨五入(pixel) タスクバーの高さ(pixel) 計(pixel)
画面幅 1440 1920 - 1920
画面高 780 1040 40 1080

ウィンドウサイズ(pt単位)から、画面解像度(pixel単位)が取得換算できました。

最大化モードにした場合

それでは通常モードではなく最大化の場合はどうでしょうか。次のコードを追加して最大化します。(普通に最大化してもいいです)

  '**ウィンドウを最大化する
  ActiveWindow.WindowState = xlMaximized

f:id:dz_dzone:20181205161556j:plain
f:id:dz_dzone:20181205161622j:plain
サイズはポイント(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

結論:目的によってはこの方法でも構わない

上記のように解像度は大体決まっているので、最大化して換算して大体その解像度に近いものが画面解像度になる、というものでも十分だと思います。使用目的、例えば画面解像度にしたがってユーザーフォームの大きさを変えるとか、ウィンドウ位置を制御するとか、そういった目的に使うのであればこの程度の精度の取得でも問題ないのではないでしょうか。

以上。