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

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

(Office VBA)【決定版】マルチディスプレイ環境でユーザーフォームを親ウィンドウの中央に表示する・後編

f:id:dz_dzone:20170814233145j:plain

はじめに

前編では、全体の処理の流れを追いました。今回は実際どこにどのように記述すれば良いかを解説します。

これまでのやり方は乱雑だった……

実はこれまでユーザーフォームを中央に表示させるのに、呼び出し元のマクロの方に中央表示の記述(内容は前回の処理の流れ)をしていました。しかしそれだといちいち同じコードを記述しなくてはならず、元のマクロのコードが乱雑になってしまいます。また、任意のユーザーフォーム名を引数にした中央表示マクロのFunctionプロシージャ化も(私の技量では)うまく作れませんでした。

発想を逆転してみた

ところが、実はもっと簡単な方法があったのです。それは……ユーザーフォームそのものに記述することでした。

サンプルファイルの構成

項目 名前
マクロ付きExcelブック Sample_Show_UF_Center.xlsm
起動マクロ(標準モジュール) Sample_Macro_01
ユーザーフォーム UF_Please_Wait

f:id:dz_dzone:20190829150309j:plain

起動マクロのコード

起動マクロは、標準モジュール 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

これで親ウィンドウがどこにあろうとユーザーフォームが親ウィンドウの中央に来ます。マルチディスプレイ環境でも大丈夫です。

サンプルの実行例

f:id:dz_dzone:20190829153531j:plain

別のサンプルの実行例(L字型の3画面)

たとえばこういう画面構成。メインディスプレイは「3」です。
f:id:dz_dzone:20190517085828j:plain
このように表示されます。
f:id:dz_dzone:20190517090125j:plain

サンプルファイルのダウンロード

今回のサンプルファイルは こちらからダウンロード 可能です。

おわりに

いかがでしたか? 個人的にいろいろ試行錯誤して試してきましたが、この方法が一番楽に出来ると思います。是非使ってみて下さい。

唯一面倒くさいといえば、ユーザーフォームを作るごとに中央表示設定用コードをコピペすることくらいですね。

以上です。