t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

VBA 開きすぎたコードウインドウを一括で閉じるマクロ

VBAでコーディングしていると、いつのまにか大量のコードウインドウを開いている。
f:id:t-hom:20151212212106p:plain

普段最大化して使っている分には困らないのだが、ときどきモジュールを並べて表示させたいときがある。
一応VBEのメニューにはウインドウを整列させるコマンドがあるのだが、、、

f:id:t-hom:20151212212354p:plain


どれとどれを並べるかという指定ができないので、全部並んでしまうのだ。

f:id:t-hom:20151212212513p:plain

これだと一つ一つが小さすぎて並べた意味がない。

そこで、不要なものを閉じていくわけだが、これがまた面倒くさい。
一気に閉じる方法も標準では用意されていないので、あまりに開きすぎた場合などは、一旦Excelごと再起動させていた。

今回はこの開きすぎたコードウインドウを一括クローズするマクロを紹介する。

まずコーディングの前に、セキュリティセンターのマクロの設定から、VBA プロジェクト オブジェクト モデルへのアクセスを信頼するにチェックを入れておく。
f:id:t-hom:20151212213350p:plain

※ただし、マクロウイルスに対するセキュリティは低下するのでネットからダウンロードしたマクロ付きのブックを開くときは十分に注意が必要。いまどきマクロウイルスも無いとは思うが、あくまで自己責任である。

次に、VBEのツールメニューからMicrosoft Visual Basic for Applications Extensibillity X.Xを参照設定しておく。
f:id:t-hom:20151212213020p:plain

※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に設定しておく。
f:id:t-hom:20151212221416p:plain

コードは次のとおり。

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をクリックする。
f:id:t-hom:20151212222430p:plain

すると、選択したものを除く全てのコードペインが閉じられる。

ただし、フォームデザイン画面はコードペインではないので閉じない。
これを閉じたい場合はまた別のコードが必要になるが、面倒なので今回は割愛する。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。