ユーザーフォームの位置を記憶しておいて、次に表示した時にその位置を復元したい、ということはよくあります。
これは簡単で、ユーザーフォームの QueryClose イベントで、Me.Top と Me.Left の値をどこかのワークシートのセルに記録しておいて、Initialize または Activate イベントでこの値を読み取り、Me.Top と Me.Left に再び設定するだけで実現できます。
ところが、困ったことに、次にオープンする時にディスプレイのサイズが違っていたり、マルチディスプレイの組み合わせが違っていたりすると、予期せぬところにフォームが表示され、運が悪いとディスプレイをはみ出してまったく表示されない、といったようなことが起こります。
これに対処するには、けっこうややこしい判別作業が必要になりそうですが、それよりもそもそも、この Top とか Left の値が、画面上でどうなっているのかを知らなくてはなりません。
そこで、そのことを検証するための小さなユーザーフォームをこしらえて、その位置を動かすとそれにあわせた Top と Left の値を表示してくれるような検証プログラムを作ってみました。
マルチディスプレイの上であちこり動かしてみると、けっこう面白い発見があります。
ThisWorkbook
Private Sub Workbook_Open()
TargetForm.Show
End Sub
TargetForm のコード
Private windowWidth
Private windowHeight
Private Sub UserForm_Initialize()
With ActiveWindow
.WindowState = xlMaximized
windowWidth = .Width
windowHeight = .Height
.WindowState = xlNormal
End With
Me.Caption = "H = " & windowHeight & " : W = " & windowWidth
End Sub
Private Sub UserForm_Layout()
TopLabel.Caption = Me.Top
LeftLabel.Caption = Me.Left
End Sub