ユーザーフォームを解像度に合わせてサイズ調整

UserFormのサイズを解像度に合わせてサイズと表示倍率を自動的に調整する処理

'Excelを最大化して、そのサイズに合わせてフォームの大きさも変更
Application.WindowState = xlMaximized
Const 高さ割合 As Double = 0.8
Me.Zoom = Me.Zoom * ((Application.Height * 高さ割合) / Me.Height)
Me.Width = Me.Width * ((Application.Height * 高さ割合) / Me.Height)
Me.Height = Me.Height * ((Application.Height * 高さ割合) / Me.Height)

↑Initializeイベント内に貼り付け

Private Sub UserForm_Initialize()

'Excelを最大化して、そのサイズに合わせてフォームの大きさも変更
Application.WindowState = xlMaximized
Const 高さ割合 As Double = 0.8
Me.Zoom = Me.Zoom * ((Application.Height * 高さ割合) / Me.Height)
Me.Width = Me.Width * ((Application.Height * 高さ割合) / Me.Height)
Me.Height = Me.Height * ((Application.Height * 高さ割合) / Me.Height)

End Sub

↑イベント未作成時の場合、モジュール内に貼り付け

ユーザーフォームと解像度

ユーザーフォームをある程度作成するようになって時間が経ってくると、気づくことがあります
それが、PC画面の解像度の違いによってフォームがちっちゃなってしまうことです

逆に、解像度の高いPCで作ったフォームが低いPCではみ出してしまったり妙にでかくて不格好になってしまうこともあります

この状況に対応するには、フォームの大きさを解像度に合わせて変更してあげる必要があります

以前考えていた方法は、作成したフォームの大きさを元に調整していましたがその方法だとコード上にその数値を入力する必要もあり、ワイド画面かどうかでも修正が必要だったのですこし面倒でした

そこで今回考えたのが、今回の例コードです
これはExcelの高さを元に計算するので、ワイド画面かどうかの判断は必要なくなりました

ただ、一つどうしようもないのは文字のはみ出しのZoomプロパティの調整関係ですが、これはこのプロパティで調整する以上はあきらめるしかありません
これの完璧な調整はコマンドそれぞれに大きさの調整を行っていく必要があります

コードで自動サイズ調整

作成したときの解像度のフォームの大きさ
【800×600】作成したフォームの大きさ

今では少し懐かしいサイズの解像度の【800×600】の画像です
当初このサイズ感で作成したので、同じ解像度ではなんの問題もありませんでした

解像度が上がったときのフォームの大きさ
【1360×768】で表示したときの大きさ

しかし、解像度の上昇により同じサイズであった場合画像のように小さくなってしまいます
Excelとの大きさを比較してもらうと分かり易いと思いますが、これでは文字が見えづらく、みんなPC画面をにらみつけるようになってしまいます

フォームの見栄えも、みんなの印象も悪くなる前に何とかしたほうが良さそうなので例コードを使用してみます

解像度が上がったときの処理後の大きさ
【1360×768】でコードを実行した時

この画像がコードを実行してサイズが自動調整された大きさです
実行前の画像と比べてみるとサイズがかなり大きくなっているのが分かると思います

こちらのコードは、Excelのサイズに自動調整されるので作成時の大きさはほぼ意味がなくなります

作成したときの解像度の処理の動き
【800×600】でコードを実行した時

これは、作成時の解像度でのコード実行時の動きです
この様に作成したときの解像度であってもサイズが自動調整されます

コードの解説

Application.WindowState = xlMaximized

これは、Excelウィンドウのサイズを最大化に設定します
Excelウィンドウサイズの高さで調整するので、これが無いと画面の大きさに等しくならないのでここで設定を入れておきます

もし、最大化することがはばかられる場合は事前にサイズの設定を取得しておき高さを取得してから戻せばいいです

WinAPIを使えば解像度の取得は出来るので、ここは必要なくなりますがこの1行で準備できるなら楽ですよね

Const 高さ割合 As Double = 0.8

ここでExcelウィンドウの高さに対するフォームの高さを定数で指定します

この「0.8」が割合の数値ですので、Excelの高さの80%という意味になります

ここの数値を任意に変更してください、この設定値次第ではZoomプロパティでエラーが発生する可能性があるのでその際は調整してください
Double型なので、もっと細かい数値設定は可能ですが「1」を超えないようにしてください、画面からはみだしますね

Me.Zoom = Me.Zoom * ((Application.Height * 高さ割合) / Me.Height)

ここからフォームの表示設定を行っています

ここのオブジェクト名「Me」とは、このコードの記載されたユーザーフォームが指定されるもので、ActiveCellのような感じの使い方です

ここでは「Zoom」プロパティの設定を変更しています、プロパティの設定は以下の記事を確認してください

Excelウィンドウのの高さに定数「高さ割合」を積算します
ここでは「0.8」を積算する形になります
その高さとフォームの高さを除算して割合を出します

この時、画像の例とは逆にフォームがExcel本体より大きすぎた場合は、100%未満になってフォームのサイズが小さくなります

Me.Width = Me.Width * ((Application.Height * 高さ割合) / Me.Height)

次にフォームの横幅を調整します
Zoomプロパティと同じように計算を行います

なお、高さを元に調整しているのでZoomとWidthは入れ替わっても問題ありませんが、最後にHeightは調整するようにしてください

Me.Height = Me.Height * ((Application.Height * 高さ割合) / Me.Height)

最後に高さの調整です
計算自体は全て同じですが、ここで計算式に入っているHeightプロパティに代入するのでこれ以降は同じ計算は行えません

またコードを見て分かるように、割合の計算式は3行とも同じものなので変数や定数を使用して割合数値を代入して計算させてもいいです
例コードではコピペ行数を減らすために使用していません

最後にこのコードはユーザーフォームの「Initialize」イベント内に作成してください、起動してから変更する場合は位置調整が必要になる場合があるので面倒です
また、UserFormの「StartUpPosition」には画面の中央に設定をしておくと変更後のサイズで自動的に中央に配置してくれます

別のサイズ調整方法として

'Excelを最大化して、そのサイズに合わせてフォームの大きさも変更
Application.WindowState = xlMaximized
Me.Zoom = Me.Zoom * (Application.Height / Me.Tag)
Me.Width = Me.Width * (Application.Height / Me.Tag)
Me.Height = Me.Height * (Application.Height / Me.Tag)
Private Sub UserForm_Initialize()

'Excelを最大化して、そのサイズに合わせてフォームの大きさも変更
Application.WindowState = xlMaximized
Me.Zoom = Me.Zoom * (Application.Height / Me.Tag)
Me.Width = Me.Width * (Application.Height / Me.Tag)
Me.Height = Me.Height * (Application.Height / Me.Tag)

End Sub

↑イベント未作成時の場合

別の調整方法として作成時のExcelの高さを保存しておきその数値で新しい環境と比較して自動調整する方法です

こちらは1つ目の方法と違って、作成時の環境の高さの数値を保存しておく必要があるため少し面倒なので少しだけ紹介しておきます
1つ目と違うのは割合の計算式の部分だけなのでそれ以外のコードは1つ目のコードを参照してください

Me.Zoom = Me.Zoom * (Application.Height / Me.Tag)
赤字の部分だけ違っていますが、これはExcelの高さをユーザーフォームのTagプロパティに保存された数値で除算して割合を出しています
このTagプロパティに保存する数値は作成したPC環境でのExcelの高さの数値を入力しておきます

Debug.Print Application.Height

このコードでExcelの高さをイミディエイトに出力できますので、この数値をTagプロパティに入力してください
この数値を基準に割合計算を行います

こちらの方法であれば、作成したときの大きさと同じ解像度の場合にサイズの自動調整が行われないので1つ目の方法で現在の使用環境でうまく文字が収まらないのでどうしようも無い時に使えますが、やはりTagに入力するのと占有されるのが難点ではあります
ですが、もともとこのサイズ調整は解像度がもし違う場合に、その環境に合わせておきたいレベルの話が多いので全くの無駄とは言えません