マクロで参照設定を操作する


VBAの参照設定を操作するときは、VBEの[ツール]-[参照設定]を実行して[参照設定]ダイアログボックスを開きます。ここで、参照設定したいライブラリにチェックを入れると、VBAからそのライブラリを利用できるようになります。

参照設定されているライブラリの情報は、Referencesコレクションで取得できます。次のコードは、アクティブブックで参照設定しているライブラリの情報を表示します。

Sub Sample1()
    Dim Ref, buf As String
    For Each Ref In ActiveWorkbook.VBProject.References
        buf = buf & Ref.Name & vbTab & Ref.Description & vbCrLf
    Next Ref
    MsgBox buf
End Sub

参照設定を追加するには、ReferencesコレクションのAddFromFileメソッドを使います。引数には、参照設定に追加したいライブラリのフルパスを指定します。次のコードは、「DAO 3.6オブジェクトライブラリ」を参照設定に追加します。

Sub Sample2()
    Const RefFile As String = "C:\Program Files\Common Files\Microsoft Shared\DAO\dao360.dll"
    ActiveWorkbook.VBProject.References.AddFromFile RefFile
End Sub

すでに追加されている参照設定を解除するには、Removeメソッドを使います。引数には解除したいReferenceオブジェクトを指定します。Referenceオブジェクト(参照設定)の名前やインデックス値ではなく、Referenceオブジェクトです。次のコードは、「DAO 3.6オブジェクトライブラリ」が参照設定されていたら解除します。

Sub Sample3()
    Dim Ref
    With ActiveWorkbook.VBProject
        For Each Ref In ActiveWorkbook.VBProject.References
            If Ref.Description = "Microsoft DAO 3.6 Object Library" Then
                .References.Remove Ref
            End If
        Next Ref
    End With
End Sub

さて、参照設定とは、パソコンにインストールされているライブラリを、VBAから使えるように参照する仕組みです。どんなライブラリを組み込むかの情報はブックごとに記録されますが、そのブックを開いたパソコンに、そのライブラリがインストールされている保証はありません。もしインストールされていない(存在しない)ライブラリが参照設定されていた場合は、[参照設定]ダイアログボックスに「参照不可」と表示されます。

参照設定が「参照不可」かどうかは、ReferenceオブジェクトのIsBrokenプロパティで調べることができます。

Sub Sample4()
    Dim Ref, buf As String
    For Each Ref In ActiveWorkbook.VBProject.References
        buf = buf & Ref.IsBroken & vbCrLf
    Next Ref
    MsgBox buf
End Sub

しかし、「参照不可」の参照設定項目は、正常な状態ではありませんので、NameプロパティやDescriptionプロパティなどにアクセスすることはできません。

Sub Sample5()
    Dim Ref
    For Each Ref In ActiveWorkbook.VBProject.References
        If Ref.IsBroken Then MsgBox Ref.Name
    Next Ref
End Sub

Sub Sample6()
    Dim Ref
    For Each Ref In ActiveWorkbook.VBProject.References
        If Ref.IsBroken Then MsgBox Ref.Description
    Next Ref
End Sub

さらに、「参照不可」の項目はRemoveメソッドで解除しようとするとエラーになりますので注意が必要です。

Sub Sample7()
    Dim Ref
    With ActiveWorkbook.VBProject
        For Each Ref In ActiveWorkbook.VBProject.References
            If Ref.IsBroken Then .References.Remove Ref
        Next Ref
    End With
End Sub

さまざまなクラスライブラリで「参照不可」を解除しようとテストしましたが、いずれもエラーになりました。また、環境の異なるいくつかのパソコンでテストしても同じでした。ただし、Excel 97ではエラーになりません。「参照不可」の項目をRemoveメソッドで正常に解除できました。

Microsoftの技術情報などには「解除できる」と明記されているコンテンツもありますが、それはExcel 97時代に書かれたのではないでしょうか。バグか仕様変更かわかりませんが、何らかの理由でExcel 2000からは「参照不可」をRemoveできなくなったにもかかわらず、技術情報などのコンテンツは動作を確認しないまま更新されているのでは……と想像しています。

もし「Excel 2000以降でも解除できる」という情報をお持ちの方がいらしたら、ぜひ教えてください。