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
Sub UFPositionCenter(UFOb As Object)
'**ユーザーフォームを親ウィンドウの中央に表示する
'参考
'https://dz11.hatenadiary.jp/entry/2019/05/17/090258
'**変数(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
'3ディスプレイ用追加
'最大化、及びウィンドウ判定定数
Dim rightDisplay_L, rightDisplay_T As Long
rightDisplay_L = -555
rightDisplay_T = -2000
'メインウィンドウ、最大化実行時の補正
If rightDisplay_L < L_AW And L_AW < 0 Then
L_AW = L_AW / 2
If rightDisplay_T < T_AW Then T_AW = T_AW / 2
End If
'**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 = 0
UFOb.Top = T_UF
UFOb.Left = L_UF
End Sub