はじめに
「開いている全てのブックに対して、同じ処理を実行したい」というマクロを作成する際、For Each book In Workbooks というループを使うのが一般的です。
しかし、この方法だと、通常は非表示になっている「個人用マクロブック(PERSONAL.XLSB)」まで処理の対象に含まれてしまい、意図しない結果になることがあります。
この記事では、個人用マクロブックを一時的に「アドイン」として扱うことで、Workbooks コレクションのループ対象から安全に除外する、上級者向けのテクニックをご紹介します。
IsAddin プロパティでループ対象から除外する
Excelの Workbook オブジェクトには、.IsAddin というプロパティがあります。これを True に設定すると、そのブックはアドインとして扱われるようになり、Workbooks コレクションに含まれなくなります。
以下のサンプルコードは、このプロパティを設定する前と後で、Workbooks コレクションの中身がどう変わるかを確認するものです。
完成コード
' IsAddinプロパティの効果を確認する
Sub ExcludePersonalMacroBook()
Dim targetBook As Workbook
' --- 変更前のブック一覧を出力 ---
Debug.Print "--- IsAddin変更前のWorkbooks一覧 ---"
For Each targetBook In Workbooks
Debug.Print targetBook.Name
Next targetBook
' --- PERSONAL.XLSBのIsAddinプロパティを変更 ---
On Error Resume Next ' PERSONAL.XLSBが開かれていない場合のエラーを回避
Workbooks("PERSONAL.XLSB").IsAddin = True
On Error GoTo 0
' --- 変更後のブック一覧を出力 ---
Debug.Print vbCrLf & "--- IsAddin変更後のWorkbooks一覧 ---"
For Each targetBook In Workbooks
Debug.Print targetBook.Name
Next targetBook
' --- 設定を元に戻す(任意) ---
' 元に戻さないと、PERSONAL.XLSBがVBEから見えにくくなる等の影響がある
On Error Resume Next
Workbooks("PERSONAL.XLSB").IsAddin = False
On Error GoTo 0
Debug.Print vbCrLf & "※処理後にIsAddinプロパティをFalseに戻しました。"
End Sub
実行結果
このマクロを実行すると、VBEのイミディエイトウィンドウ(Ctrl + Gで表示)に以下のように出力されます。
--- IsAddin変更前のWorkbooks一覧 ---
PERSONAL.XLSB
Book1.xlsx
AnotherBook.xlsx
--- IsAddin変更後のWorkbooks一覧 ---
Book1.xlsx
AnotherBook.xlsx
※処理後にIsAddinプロパティをFalseに戻しました。
変更後の一覧から PERSONAL.XLSB が消えていることが分かります。
コードの解説
Workbooks("PERSONAL.XLSB").IsAddin = True
この一行が処理の核心です。PERSONAL.XLSB ブックの .IsAddin プロパティを True に設定しています。これにより、このブックは Workbooks コレクションのメンバーから外れ、代わりに AddIns コレクションのメンバーとして扱われるようになります。
On Error Resume Next
個人用マクロブックを使っていない(PERSONAL.XLSB が開かれていない)環境でこのマクロを実行すると、Workbooks("PERSONAL.XLSB") の部分でエラーが発生します。On Error Resume Next は、そうした場合にエラーを無視して処理を続行させるためのおまじないです。
Workbooks("PERSONAL.XLSB").IsAddin = False
マクロの最後に、変更した設定を元に戻しています。.IsAddin = True のままにしておくと、VBEのプロジェクトエクスプローラー上で PERSONAL.XLSB が非表示になるなど、開発時に不便が生じることがあるため、処理が終わったら False に戻しておくのが丁寧な実装です。
まとめ
今回は、開いている全ブックを対象とするループ処理から、個人用マクロブックを意図的に除外する方法を解説しました。
.IsAddin = Trueを設定することで、ブックをWorkbooksコレクションから隠すことができる。- 処理が終わったら、
.IsAddin = Falseに戻すのが望ましい。
このテクニックを使えば、「ユーザーが実際に開いて作業しているブックだけ」を対象とした、より安定的で精度の高いマクロを作成することができます。少しマニアックですが、非常に強力なテクニックですので、ぜひ覚えておきましょう。
