Excel VBAの参照設定
【環境】Windows 10 Pro 64bit、Excel for Office 365
Excel VBA (Microsoft Visual Basic for Applications)で参照設定を操作する方法について解説します
■参照設定を開く
Visual Basic Editorの[ツール] – [参照設定]で開きます
参照設定でライブラリファイルにチェックを入れることで、そのライブラリを VBA から使用することができるようになります
参照設定のダイアログに関する説明は、MicrosoftのWEBサイトを見てくださいw
参照サイト:「[参照設定] ダイアログ ボックス | Microsoft Docs」
■FileSystemObjectオブジェクトを使うには?
今回は、ファイル操作を行う時に、よく使用する FileSystemObject のメンバを参照できるようにしてみましょう!
・参照設定なし
参照を設定せずに、変数のタイプに FileSystemObject を指定しても入力補完機能(インテリセンス)は利用できません
・参照設定あり
– Microsoft Scripting Runtimeを追加
「Microsoft Scripting Runtime」を参照設定 に追加します
すると インテリセンス が利用できるようになりますね!
メンバを参照することもできるので、非常にコード生成が楽になります
■Scriptingライブラリとは
今、サンプル「 FileSystemObject_Sample1() 」では、 FileSystemObject を直接指定しています
もちろん、参照の場合は、パラメータのヘルプなどもこれだけで表示することはできるのですがー
FileSystemObject は、参照に追加したライブラリ 「 Microsoft Scripting Runtime 」の名の通り、「 Scripting 」というライブラリが持っているのです!
オブジェクトブラウザーで「 Scripting 」というライブラリを選択して頂くと、以下のように、 FileSystemObject がいるのがわかりますよね!
他にも 以下のような、便利なオブジェクトが多数含まれています
- Dictionary
- TextStream
- Encoder
- Drive
- File
- Folder
この「 Scripting 」に「 FileSystemObject 」が含まれるということは、つまり「 Scripting.FileSystemObject 」が正式名称!?なのです!?(たぶん)
というわけで、オブジェクト名を使用してサンプルを書いてみます・・・①
Sub FileSystemObject_Sample1()
Dim obj As Scripting.FileSystemObject
Set obj = New Scripting.FileSystemObject
Call obj.CreateFolder("C:\\aaa")
Set obj = Nothing
End Sub
ちょっと、うるさいので、あっさりとこう書くこともできます・・・②
Sub FileSystemObject_Sample1()
Dim obj As New Scripting.FileSystemObject
Call obj.CreateFolder("C:\\aaa")
Set obj = Nothing
End Sub
「 obj 」や「 Nothing 」も削って、こう書くことも・・やりすぎですかね?w・・・③
Sub FileSystemObject_Sample1()
With New Scripting.FileSystemObject
Call .CreateFolder("C:\\aaa")
End With
End Sub
■実行時バインディング
参照を使用せずに CreateObject を使用して、 FileSystemObject をオブジェクト化する際には 実行時バインディング として「 Scripting.FileSystemObject 」と指定しないとエラーになってしまいます
Sub FileSystemObject_Sample2()
Dim obj As Object
Set obj = CreateObject("Scripting.FileSystemObject")
Call obj.CreateFolder("C:\\aaa")
Set obj = Nothing
End Sub
というわけで、参照の場合も「 Scripting.FileSystemObject 」と書く癖をつけておいた方が良いかも知れませんね!
参照を使った3つのやり方の中で最も近いのは、①ですかね?置き換えることを考えて①の書き方にしておけば良さそうです
■VBAで参照を操作する
余談ではありますが、「 Microsoft Scripting Runtime 」のファイルは以下の “scrrun.dll” です
※パスは環境が64bitなので、32bitのシステムファイルのパスとして、
「 C:\Windows\SysWOW64\ 」になっていますが、32bit環境では
「 C:\Windows\System32\ 」になりますねー
つまりは、この 「 Microsoft Scripting Runtime 」 のファイルがないと FileSystemObject は使えないのです!(ないってことはないと思いますが・・)
ここからは、 VBA を使用して、参照を追加したり、削除したりしてみます!
・参照をVBAで追加
参照設定のダイアログボックスを開いて、希望するライブラリを探して選択するのって、割と面倒ですよねw
そんな時は、こんな感じで、VBAで登録してしまいましょう!
①参照追加の呼び出し元関数
Sub CallReferencesAddFromFile_Sample()
' 参照に追加するライブラリのファイルパスを用意します(ここではFileSystemObjectを追加する例)
Const DLL_SCRRUN As String = "C:\Windows\SysWOW64\scrrun.dll"
' 参照追加関数にライブラリのファイルパスを渡して呼び出す
Call References_AddFromFile(DLL_SCRRUN)
End Sub
②参照を追加する関数
Sub References_AddFromFile(dllPath As String)
' 参照を追加する
Call Excel.ThisWorkbook.VBProject.References.AddFromFile(dllPath)
End Sub
・参照をVBAで削除
参照を削除するには、以下のように行います
③参照削除の呼び出し元関数
Sub CallReferencesRemove_Sample()
' 参照から削除するライブラリのファイルパスを用意します(ここではFileSystemObjectを削除する例)
Const DLL_SCRRUN As String = "C:\Windows\SysWOW64\scrrun.dll"
' 削除関数にライブラリのファイルパスを渡して呼び出す
Call References_Remove(DLL_SCRRUN)
End Sub
④参照を削除する関数
Sub References_Remove(dllPath As String)
Dim obj As Object
With Excel.ThisWorkbook.VBProject
' ファイルで参照しているものを検索します
For Each obj In .References
' 参照不可ではない場合のみ実施する
If (obj.IsBroken = False) Then
' Name、Description、FullPath、IsBrokenのプロパティを持っています
If (obj.FullPath = dllPath) Then
' 参照を削除する
Call .References.Remove(obj)
End If
End If
Next
End With
End Sub
④はネストし過ぎて読みづらいですねー
こういうソースはダメ!非常に恥ずかしいソースです・・
というわけで、 VBIDE を使った書き方に書き直してみたが・・
ネストが減らない上に、余計に気持ち悪くなってきたw
⑤気持ち悪い例w
Sub References_Remove2(dllPath As String)
Dim refers As VBIDE.References
Dim ref As VBIDE.Reference
Dim rName As String
Set refers = Excel.ThisWorkbook.VBProject.References
' 参照しているものを探します
For Each ref In refers
' 参照不可ではない場合のみ実施する
If (ref.IsBroken = False) Then
' ライブラリのファイルパスで比較
If (ref.FullPath = dllPath) Then
rName = ref.Name
Exit For
End If
End If
Next
If (Len(rName) > 0) Then
' Nameプロパティを渡してオブジェクトを取得する
Set ref = refers.Item(rName)
' 参照を削除する
Call refers.Remove(ref)
Set ref = Nothing
End If
Set refers = Nothing
End Sub
⑧ライブラリ名で参照を削除する呼び出し元関数
Sub CallReferencesRemove_Sample3()
' 参照から削除するライブラリ名
Const DLL_SCRRUN As String = "Scripting"
' 削除関数にライブラリ名を渡して呼び出す
Call References_Remove3(DLL_SCRRUN)
End Sub
⑨ライブラリ名で参照を削除する関数
Sub References_Remove3(dllName As String)
Dim ref As VBIDE.Reference
With Excel.ThisWorkbook.VBProject
Set ref = .References(dllName)
If Not (ref Is Nothing) Then
Call .References.Remove(ref)
End If
Set ref = Nothing
End With
End Sub
パッと見は綺麗になったんですが、 IsBroken プロパティを見ていないし、
「 Set ref = .References(dllName) 」でライブラリがなかったらエラーになります!
根本的にライブラリのパスを使って、追加や削除するのがダメな気がしますけどw
参考までに GUID で追加するサンプルも書いてみますが、大して変わり映えしないです
⑥ GUID を使用して参照を追加する呼び出し元関数
Sub CallReferencesAddFromGuid_Sample()
' 参照に追加するライブラリのGUIDを用意します(ここではFileSystemObjectを追加する例)
Const DLL_SCRRUN As String = "{420B2830-E718-11CF-893D-00A0C9054228}"
' 参照追加関数にライブラリのGUIDとバージョン(MajorとMinor)を渡して呼び出す
Call References_AddFromGuid(DLL_SCRRUN, 1, 0)
End Sub
⑦ GUID を使用して参照を追加する関数
Sub References_AddFromGuid(guid As String, major As Long, minor As Long)
' 参照を追加する
Call Excel.ThisWorkbook.VBProject.References.AddFromGuid(guid, major, minor)
End Sub
・参照設定の一覧表示
VBA で参照しているライブラリの一覧を表示してみます
Sub GetReferencesList_Sample()
Dim refers As VBIDE.References
Dim ref As VBIDE.Reference
Set refers = Excel.ThisWorkbook.VBProject.References
For Each ref In refers
Debug.Print "--------------------------------------------------------------------------------------------------------------"
Debug.Print ref.Name, ref.guid & " : " & ref.Major & "." & ref.Minor & " : " & ref.Description
Debug.Print ref.FullPath
Next ref
Debug.Print "--------------------------------------------------------------------------------------------------------------"
出力結果
--------------------------------------------------------------------------------------------------------------
VBA {000204EF-0000-0000-C000-000000000046} : 4.2 : Visual Basic For Applications
C:\Program Files (x86)\Common Files\Microsoft Shared\VBA\VBA7.1\VBE7.DLL
--------------------------------------------------------------------------------------------------------------
Excel {00020813-0000-0000-C000-000000000046} : 1.9 : Microsoft Excel 16.0 Object Library
C:\Program Files (x86)\Microsoft Office\Root\Office16\EXCEL.EXE
--------------------------------------------------------------------------------------------------------------
stdole {00020430-0000-0000-C000-000000000046} : 2.0 : OLE Automation
C:\Windows\SysWOW64\stdole2.tlb
--------------------------------------------------------------------------------------------------------------
Office {2DF8D04C-5BFA-101B-BDE5-00AA0044DE52} : 2.8 : Microsoft Office 16.0 Object Library
C:\Program Files (x86)\Common Files\Microsoft Shared\OFFICE16\MSO.DLL
--------------------------------------------------------------------------------------------------------------
Outlook {00062FFF-0000-0000-C000-000000000046} : 9.6 : Microsoft Outlook 16.0 Object Library
C:\Program Files (x86)\Microsoft Office\Root\Office16\MSOUTL.OLB
--------------------------------------------------------------------------------------------------------------
VBIDE {0002E157-0000-0000-C000-000000000046} : 5.3 : Microsoft Visual Basic for Applications Extensibility 5.3
C:\Program Files (x86)\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB
--------------------------------------------------------------------------------------------------------------
Scripting {420B2830-E718-11CF-893D-00A0C9054228} : 1.0 : Microsoft Scripting Runtime
C:\Windows\SysWOW64\scrrun.dll
--------------------------------------------------------------------------------------------------------------
・参考
VBProject を使う場合は、 VBIDE というライブラリを参照するとクラスが使えるようになります!
■注意事項
参照設定は、開発時には非常に便利なのですが、開発したPC以外で動作させるには、
色々と注意事項があるのです!
- 参照はライブラリファイルを指定する
- 参照ライブラリがインストールしていないPCでは動作しない
- Office 等のバージョン違いやライブラリのバージョンが異なると動作しない
- 古いバージョンで「参照不可」になると参照や削除ができません
- 参照不可かどうかは References の IsBroken プロパティで確認する
- 環境依存な参照は使わないようにする
- 実行時バインディングに変換できるよう個別でクラス化しておく
ではでは








