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 プロパティで確認する
- 環境依存な参照は使わないようにする
- 実行時バインディングに変換できるよう個別でクラス化しておく
ではでは