【VBA】個人用マクロブックをWorkbooksコレクションのループ対象から外す方法

目次

はじめに

「開いている全てのブックに対して、同じ処理を実行したい」というマクロを作成する際、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 に戻すのが望ましい。

このテクニックを使えば、「ユーザーが実際に開いて作業しているブックだけ」を対象とした、より安定的で精度の高いマクロを作成することができます。少しマニアックですが、非常に強力なテクニックですので、ぜひ覚えておきましょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次