Excelの「新しいウィンドウを開く」機能は、複数のシートを同時に見比べる際に非常に便利ですが、作業が終わった後に Book1:1, Book1:2, Book2:1, Book2:2 … のようにウィンドウが散らかってしまい、一つずつ閉じるのが面倒になることがあります。
VBAを使えば、開いているすべてのブックの複製ウィンドウ(:2、:3…)だけを検出し、一括で閉じる「お片付けマクロ」を簡単に作成できます。
完成したVBAコード
以下が、すべてのブックの複製ウィンドウを閉じ、最後に残ったウィンドウを最大化するVBAコードです。
Sub CloseAllDuplicateWindows()
' 変数を宣言します
' Excel.Window型で宣言すると、入力補完が効いて便利です
Dim win As Excel.Window
' --- 1. アプリケーションで開かれているすべてのウィンドウをループ ---
' For Eachループで、開いているウィンドウを一つずつチェックします
For Each win In Application.Windows
' --- 2. ウィンドウ番号が1より大きいか(複製か)を判定 ---
' .WindowNumberプロパティが、ウィンドウの番号を返します
If win.WindowNumber > 1 Then
' 複製ウィンドウ(2番目以降)であれば、そのウィンドウを閉じる
win.Close
End If
Next win
' --- 3. 残ったウィンドウを最大化して表示を整える ---
' ウィンドウが一つもなくなった場合のエラーを避ける
If Application.Windows.Count > 0 Then
ActiveWindow.WindowState = xlMaximized
End If
MsgBox "複製ウィンドウをすべて閉じました。"
End Sub
コードのポイント解説
① Application.Windows コレクション
For Each win In Application.Windows
Application.Windowsは、現在Excelアプリケーションで開かれているすべてのブックの、すべてのウィンドウの集まり(コレクション)です。特定のブックに限定したThisWorkbook.Windowsとは異なり、Excel全体で開いているウィンドウを操作対象にします。
② ウィンドウ番号を調べる: .WindowNumber
これが、複製ウィンドウを特定するための最も重要なプロパティです。
- **
.WindowNumber**は、同じブックに対するウィンドウが何番目に開かれたものかを示す数値を返します。 - どのブックであれ、元の**主となるウィンドウは必ず
WindowNumberが1**になります。 - 「新しいウィンドウを開く」で作成された複製ウィンドウは、
2,3,4… と連番が振られます。
したがって、If win.WindowNumber > 1 Thenという条件式を使うことで、元のウィンドウ(:1)は残しつつ、複製ウィンドウ(:2以降)だけを正確に特定することができます。
③ 複製ウィンドウを閉じる: .Close
win.Close
Windowオブジェクトに対して.Closeメソッドを実行します。 複製ウィンドウ(例: Book1:2)を閉じても、ブックファイルそのものが閉じるわけではありません。あくまでその「表示」が閉じられるだけで、元のウィンドウ(Book1:1)は開いたまま残ります。
④ 表示の最大化: .WindowState
ActiveWindow.WindowState = xlMaximized
すべての複製ウィンドウを閉じた後、最後にアクティブだったウィンドウが中途半端なサイズで残っている可能性があります。このコードでウィンドウを最大化することで、画面を整理して作業を再開しやすくしています。
まとめ
散らかった複製ウィンドウを一度に閉じる処理は、非常にシンプルです。
For Eachループで、Application.Windowsコレクションを巡回する。- ループの中で、各ウィンドウの**
.WindowNumberプロパティ**の値を確認する。 - もし値が**
1より大きければ**、それは複製ウィンドウなので**.Close**メソッドで閉じる。
このマクロをクイックアクセスツールバーなどに登録しておけば、ウィンドウを多用する作業の効率が格段にアップします。
