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以降でも解除できる」という情報をお持ちの方がいらしたら、ぜひ教えてください。