VBAでコーディングしていると、いつのまにか大量のコードウインドウを開いている。
普段最大化して使っている分には困らないのだが、ときどきモジュールを並べて表示させたいときがある。
一応VBEのメニューにはウインドウを整列させるコマンドがあるのだが、、、
どれとどれを並べるかという指定ができないので、全部並んでしまうのだ。
これだと一つ一つが小さすぎて並べた意味がない。
そこで、不要なものを閉じていくわけだが、これがまた面倒くさい。
一気に閉じる方法も標準では用意されていないので、あまりに開きすぎた場合などは、一旦Excelごと再起動させていた。
今回はこの開きすぎたコードウインドウを一括クローズするマクロを紹介する。
まずコーディングの前に、セキュリティセンターのマクロの設定から、VBA プロジェクト オブジェクト モデルへのアクセスを信頼するにチェックを入れておく。
※ただし、マクロウイルスに対するセキュリティは低下するのでネットからダウンロードしたマクロ付きのブックを開くときは十分に注意が必要。いまどきマクロウイルスも無いとは思うが、あくまで自己責任である。
次に、VBEのツールメニューからMicrosoft Visual Basic for Applications Extensibillity X.Xを参照設定しておく。
※X.Xの値はExcelのバージョンによって異なる。
参照設定はブックごとの設定になるため、今回のコードでは個人用マクロブック(PERSONAL.XLSB)を選択した状態で設定しておくと良い。
あとはPERSONAL.XLSBの適当なモジュールに次のコードを書いて実行するだけ。
Sub 全てのコードウインドウを閉じる() Dim c As CodePane For Each c In Application.VBE.CodePanes c.Window.Close Next End Sub
実はこの機能は以前紹介したMZ-Toolsに含まれているが、会社のPCに導入するわけにもいかず、今回自作することとなった。
thom.hateblo.jp
閉じたくないウインドウを指定する方法
特定の2つだけ残しておきたいといったシチュエーションも考えられる。
単に開きなおせば良いのであまり需要は無い気がするが、フォームを使って実現する方法があるので一応紹介しておく。
まずユーザーフォームを追加し、リストボックスとボタンを配置する。
このとき、リストボックスのMultiSelectを1 - fmMultiSelectMultiに設定しておく。
コードは次のとおり。
Private Sub UserForm_Initialize() Dim c As CodePane For Each c In Application.VBE.CodePanes Me.ListBox1.AddItem c.Window.Caption Next End Sub Private Sub CommandButton1_Click() Dim 残すウインドウのタイトル As New Collection For i = 0 To Me.ListBox1.ListCount - 1 If Me.ListBox1.Selected(i) Then 残すウインドウのタイトル.Add Me.ListBox1.List(i) End If Next Dim c As CodePane, クローズ可能 As Boolean For Each c In Application.VBE.CodePanes クローズ可能 = True For Each x In 残すウインドウのタイトル If c.Window.Caption = x Then クローズ可能 = False Next If クローズ可能 Then c.Window.Close Next Unload Me End Sub
加えて標準モジュールにフォームを表示させるコードを書く。
Sub Macro1() UserForm1.Show End Sub
これを実行させると、コードペインのタイトルがリストに表示されるので、残したいものを選択し、OKをクリックする。
すると、選択したものを除く全てのコードペインが閉じられる。
ただし、フォームデザイン画面はコードペインではないので閉じない。
これを閉じたい場合はまた別のコードが必要になるが、面倒なので今回は割愛する。