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

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

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


f:id:dz_dzone:20170814233145j:plain

前回は、処理の流れを追いました。今回は実際どこにどのように記述すれば良いかを説明します。
実はこれまで自分で表示させるときには呼び出し元のSubプロシージャの方に記述していました。しかしそれだといちいち同じコードを記述しなくてはならず、元のSubプロシージャが乱雑になってしまいます。またUF名を引数にした汎用のFunctionプロシージャ化もまだうまくいってません。ところが、実はもっと簡単な方法があったのです。それは……ユーザーフォームそのものに記述することです。

ユーザーフォームのコードに記述する

中央表示設定用の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

これで親ウィンドウがどこにあろうとユーザーフォームが親ウィンドウの中央に来ます。マルチディスプレイ環境でも大丈夫です。
たとえばこういう画面構成。メインは3です。
f:id:dz_dzone:20190517085828j:plain
このように表示されます。
f:id:dz_dzone:20190517090125j:plain
以上。