MENU

作業中のディスプレイにユーザーフォームを表示させる方法 | Excel VBA

ユーザーフォームが意図しないディスプレイに表示されるのを解決します。

こんな方向けの記事
  • ユーザーフォームが意図しないディスプレイに表示されるのを解消します(下の図参照)

首が痛いからやめてね

2のディスプレイで作業中、ユーザーフォームが別のディスプレイに何故か表示される😖

本記事ではVBAを用い、アクティブウィンドウの中央部に表示します。

作業中のディスプレイに表示させる方法

以下のコードを「標準モジュール」と「ユーザーフォーム」に貼り付けてください。

VBAコード

日本語入力ソフトとVBAの覚え書き
(Office VBA)【決定版】マルチディスプレイ環境でユーザーフォームを親ウィンドウの中央に表示する・後編 -... 前編では、ユーザーフォームを中央に表示させる処理の流れを追いました。今後半では実際マクロのどの場所にどういうコードを記述すれば良いかを解説します。

本コードは上記サイト様の記事をベースに改変したものとなります。

標準モジュール

Sub UFPositionCenter(UFOb As Object)
  '**ユーザーフォームを親ウィンドウの中央に表示する
  '参考
  'https://dz11.hatenadiary.jp/entry/2019/05/17/090258
  '標準モジュールではMeが使えないので、ユーザーフォーム側にて引数として呼び出す

  '**変数(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 = UFOb.Width
  H_UF = UFOb.Height

  '**UFの表示位置を計算
  T_UF = T_AW + ((H_AW - H_UF) / 2)
  L_UF = L_AW + ((W_AW - W_UF) / 2)
  
  '**UFの表示位置を設定
  UFOb.StartUpPosition = Manual
  '**Top,Left指定時に必須(ないとLeftがずれる)
  UFOb.Top = T_UF
  UFOb.Left = L_UF
End Sub

ユーザーフォーム

Private Sub UserForm_Initialize()
    Call UFPositionCenter(Me)
End Sub

プログラム内容、改良点

プログラム内容
  1. ユーザーフォーム表示時、自身を引数にしてUFPositionCenterを呼び出す
  2. アクティブウィンドウの位置情報を取得
  3. ユーザーフォームのサイズを取得
  4. ユーザーフォームの表示位置を計算し、表示位置を変更
  5. ユーザーフォームをアクティブウィンドウの中央に移動
改変箇所
  • 「UFPositionCenter()」をサブルーチン化
    ユーザーフォーム側のコードが3行ですみ、メンテナンス性も向上。
シェアしてくださいな