category name  »  page title date

フォームの位置を知る

ユーザーフォームの位置を記憶しておいて、次に表示した時にその位置を復元したい、ということはよくあります。
これは簡単で、ユーザーフォームの QueryClose イベントで、Me.Top と Me.Left の値をどこかのワークシートのセルに記録しておいて、Initialize または Activate イベントでこの値を読み取り、Me.Top と Me.Left に再び設定するだけで実現できます。

ところが、困ったことに、次にオープンする時にディスプレイのサイズが違っていたり、マルチディスプレイの組み合わせが違っていたりすると、予期せぬところにフォームが表示され、運が悪いとディスプレイをはみ出してまったく表示されない、といったようなことが起こります。
これに対処するには、けっこうややこしい判別作業が必要になりそうですが、それよりもそもそも、この Top とか Left の値が、画面上でどうなっているのかを知らなくてはなりません。

そこで、そのことを検証するための小さなユーザーフォームをこしらえて、その位置を動かすとそれにあわせた Top と Left の値を表示してくれるような検証プログラムを作ってみました。
マルチディスプレイの上であちこり動かしてみると、けっこう面白い発見があります。

こしらえた小さなユーザーフォームがこれ(TargetForm としました)です。TopLabel と LeftLabel のコントロールにその時の座標が時々刻々表示されます。フォームのキャプションには、メインのディスプレイの大きさが表示されます。

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

このブックを開くと TargetForm が表示され、そのフォームをマウスで動かすと、その位置座標がここに表示されます。