VBAマクロの実行中に、他のアプリケーションと画面を並べて表示させたい場合や、ユーザーに特定の情報を見やすい位置に提示したい場合など、Excelのウィンドウそのものの表示位置を動かしたいことがあります。
VBAを使えば、ウィンドウの画面上の座標(.Left
, .Top
)を直接指定して、任意の位置に移動させることが可能です。この記事では、ウィンドウの位置を変更し、さらにマクロの処理が終わった後にユーザーが設定していた元の位置に復元するという、丁寧で確実な方法を解説します。
完成したVBAコード
以下が、ウィンドウの現在の状態と位置を一時的に記憶し、画面の左上に移動させた後、再び元の状態に戻すVBAコードです。
Sub MoveAndRestoreWindow()
' 変数を宣言します
Dim originalState As Long
Dim originalLeft As Double
Dim originalTop As Double
' --- 1. 元のウィンドウの状態と位置を記憶 ---
With ActiveWindow
originalState = .WindowState
originalLeft = .Left
originalTop = .Top
End With
' --- 2. ウィンドウの位置を変更 ---
MsgBox "ウィンドウを画面の左上に移動します。"
With ActiveWindow
' 位置を変更するには、まずWindowStateを「標準」にする必要がある
.WindowState = xlNormal
' 新しい位置(画面の左上隅)を設定
.Left = 0
.Top = 0
End With
' --- 3. 元のウィンドウ位置に戻す ---
MsgBox "ウィンドウの位置を元に戻します。"
With ActiveWindow
' 記憶しておいた元の位置を設定
.Left = originalLeft
.Top = originalTop
' 最後に、元の状態(最大化など)も復元
.WindowState = originalState
End With
MsgBox "ウィンドウの状態を元に戻しました。"
End Sub
コードのポイント解説
① 元の状態と位置を記憶する
With ActiveWindow
originalState = .WindowState
originalLeft = .Left
originalTop = .Top
End With
マクロがユーザーの作業環境を恒久的に変更してしまわないよう、まずActiveWindow
の現在の状態と位置に関する情報をすべて変数に記憶しておくのが、優れたマクロの作法です。
.WindowState
: ウィンドウが「最大化」「最小化」「標準」のいずれの状態かを取得します。.Left
/.Top
: ウィンドウの左上隅の、画面の左端/上端からの距離を「ポイント」という単位で取得します。
② WindowStateを「標準 (xlNormal)」にする
.WindowState = xlNormal
これは、ウィンドウの位置やサイズを変更する上で必須のステップです。ウィンドウの.Left
や.Top
といった位置プロパティは、ウィンドウの状態が「標準」(最大化でも最小化でもない状態)のときにしか設定できません。最大化されたウィンドウを直接動かすことはできないため、まずこの状態に切り替えます。
③ 位置を設定 (.Left / .Top)
.Left = 0
.Top = 0
ウィンドウの状態をxlNormal
にした後で、.Left
と.Top
プロパティに数値を代入します。これにより、ウィンドウの左上隅が、画面の指定した座標に移動します。サンプルコードのLeft = 0
, Top = 0
は、画面の左上隅を意味します。
④ 元の状態に復元する
.Left = originalLeft
.Top = originalTop
.WindowState = originalState
マクロの主処理が完了した後、①で記憶しておいた変数を使い、ウィンドウの位置(Left, Top)、そして状態(WindowState)を元通りに復元します。これにより、ユーザーはマクロ実行前と全く同じ環境でスムーズに作業を再開できます。
まとめ
VBAでウィンドウの位置を操作する際の、安全で推奨される手順は以下の通りです。
- 処理の最初に、現在の**
.WindowState
,.Left
,.Top
を変数に記憶**する。 - ウィンドウの状態を**
.WindowState = xlNormal
**に変更する。 - 目的の**
.Left
と.Top
**の座標を設定する。 - (マクロの主処理を実行する)
- 処理の最後に、記憶しておいた変数を使い、元の位置と状態に復元する。
この「記憶して復元する」パターンを実践することで、ユーザーの作業環境を尊重した、親切で安定性の高いマクロを作成することができます。