はじめに
「開いている全てのブックに対して、同じ処理を実行したい」というマクロを作成する際、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
に戻すのが望ましい。
このテクニックを使えば、「ユーザーが実際に開いて作業しているブックだけ」を対象とした、より安定的で精度の高いマクロを作成することができます。少しマニアックですが、非常に強力なテクニックですので、ぜひ覚えておきましょう。