(Office VBA)【決定版】マルチディスプレイ環境でユーザーフォームを親ウィンドウの中央に表示する・後編
はじめに
前編では、全体の処理の流れを追いました。今回は実際どこにどのように記述すれば良いかを解説します。
これまでのやり方は乱雑だった……
実はこれまでユーザーフォームを中央に表示させるのに、呼び出し元のマクロの方に中央表示の記述(内容は前回の処理の流れ)をしていました。しかしそれだといちいち同じコードを記述しなくてはならず、元のマクロのコードが乱雑になってしまいます。また、任意のユーザーフォーム名を引数にした中央表示マクロのFunctionプロシージャ化も(私の技量では)うまく作れませんでした。
発想を逆転してみた
ところが、実はもっと簡単な方法があったのです。それは……ユーザーフォームそのものに記述することでした。
サンプルファイルの構成
項目 | 名前 |
---|---|
マクロ付きExcelブック | Sample_Show_UF_Center.xlsm |
起動マクロ(標準モジュール) | Sample_Macro_01 |
ユーザーフォーム | UF_Please_Wait |
起動マクロのコード
起動マクロは、標準モジュール Module1 に記述します。要はいつも作っているマクロということです。
Public Sub Sample_Macro_01() ' ** サンプルマクロ 01 ** ' "しばらくお待ちください"の表示 ※時間がかかる処理の直前に呼び出す UF_Please_Wait.Show vbModeless ' 処理 : 時間がかかるような内容 ※例:5秒処理を止める Application.Wait Now() + TimeValue("00:00:05") ' 処理完了:ユーザーフォームを閉じる Unload UF_Please_Wait End Sub
ユーザーフォーム UF_Please_Waitのコード
中央表示設定用のSubプロシージャ
コードエディタの一番後ろに記述すると邪魔になりません。
Private Sub UFPositionCenter() '**ユーザーフォームを親ウィンドウの中央に表示する '**変数(T=Top,L=Left,W=Width,H=Height,AW=ActiveWindow,UF=UserForm) Dim T_AW As Long, L_AW As Long, W_AW As Long, H_AW As Long Dim T_UF As Long, L_UF As Long, W_UF As Long, H_UF As Long '**親ウィンドウの位置とサイズを取得 With ActiveWindow T_AW = .Top L_AW = .Left W_AW = .Width H_AW = .Height End With '**UFのサイズを取得 W_UF = Me.Width H_UF = Me.Height '**UFの表示位置を計算 T_UF = T_AW + ((H_AW - H_UF) / 2) L_UF = L_AW + ((W_AW - W_UF) / 2) '**UFの表示位置を設定 Me.StartUpPosition = Manual '**Top,Left指定時に必須(ないとLeftがずれる) Me.Top = T_UF Me.Left = L_UF End Sub
Private Sub UserForm_Initialize()内に以下を記述
'**UFを親ウィンドウの中央に配置する設定 Call UFPositionCenter
これで親ウィンドウがどこにあろうとユーザーフォームが親ウィンドウの中央に来ます。マルチディスプレイ環境でも大丈夫です。
サンプルの実行例
別のサンプルの実行例(L字型の3画面)
たとえばこういう画面構成。メインディスプレイは「3」です。
このように表示されます。
サンプルファイルのダウンロード
今回のサンプルファイルは こちらからダウンロード 可能です。
おわりに
いかがでしたか? 個人的にいろいろ試行錯誤して試してきましたが、この方法が一番楽に出来ると思います。是非使ってみて下さい。
唯一面倒くさいといえば、ユーザーフォームを作るごとに中央表示設定用コードをコピペすることくらいですね。
以上です。