エクセルVBAでは、外部ライブラリ(エクセル外のオブジェクト)を参照する事によりエクセルには無い機能を利用する事ができます。方法は2つあって参照設定とCreateObject関数です。
参照設定
参照設定はVBEのツール→参照設定ダイアログで設定できます。
私の環境だと、デフォルトでエクセルが参照しているライブラリは以下の4つです(Excel2019)。
- Visual Basic For Applications
- Microsoft Excel 16.0 Object Library
- OLE Automation
- Microsoft Office 16.0 Object Library
ユーザーフォームを作成すると自動でMicrosoft Forms 2.0 Object Libraryが追加されます。
普段はこのライブラリにあるクラスやモジュール、関数を利用してマクロを作成していますが、参照設定を行う事でここにはないライブラリの機能を利用できます。
VBEのツール→参照設定でダイアログを開き、参照したいライブラリにチェックを入れる。
参照設定はBookごとに保存されます。一度設定してしまえばそのBookでは再設定不要です。
参照設定ダイアログに表示されるライブラリ一覧はPC環境によって変わります。参照設定ダイアログに使いたいライブラリが無い場合、ライブラリ本体(ファイル)がインストールされていれば、直接参照することで一覧に表示させる事ができます。
参照設定ダイアログの参照ボタンを押し、ライブラリのファイル名で検索、見つかったファイルをクリックする。
一覧にライブラリが表示されます。
参考までに、デフォルトの4つと当サイトで扱った事のある外部ライブラリのファイル名は以下の通りです。
Visual Basic For Applications | VBE7.DLL |
Microsoft Excel 16.0 Object Library | EXCEL.EXE |
OLE Automation | stdole2.tlb |
Microsoft Office 16.0 Object Library | MSO.DLL |
Microsoft Forms 2.0 Object Library | FM20.DLL |
Microsoft Outlook 16.0 Object Library | MSOUTL.OLB |
Microsoft Scripting Runtime | scrrun.dll |
参照設定するときのコードサンプル
参照設定を行うだけではそのライブラリに含まれるクラスを扱う事はできません。インスタンス化が必要です。DimまたはSetステートメントにNewキーワードでオブジェクト名を指定します。
サンプルはMicrosoft Outlook 16.0 Object LibraryライブラリのApplicationオブジェクト、Microsoft Scripting RuntimeライブラリのDictionaryオブジェクトをそれぞれ使用するケースです。
Dim アウトルック as Outlook.Application
Set アウトルック = New Outlook.Application
'Outlook.Applicationオブジェクトを使用した処理を記述
Set アウトルック = Nothing
Dim アウトルック As New Outlook.Application
Dim dicオブジェクト As Dictionary
Set dicオブジェクト = New Dictionary
'Dictionaryオブジェクトを使用した処理を記述
Set dicオブジェクト = Nothing
Dim dicオブジェクト As New Dictionary
Setあり/なしの違い
違いはSetありはその行でインスタンス化(実体化)されるのに対し、Setなしは宣言だけで、まだインスタンス化されていません。Setなしがインスタンス化されるのは「そのオブジェクトが初めて参照された時」です。
Setなしサンプルでは、コードの書き方によってはひょっとしたらバグが発生するかも、位の認識です(私見)。どうしても気になる方はSetありサンプルを使って下さい。
インスタンス化について
私の簡単な理解では、クラスはそもそもオブジェクトの設計図であり、実体を持ちません。インスタンス化とは「実体化」であり、クラスをインスタンス化して初めてオブジェクトになります。
ではデフォルトで参照されているライブラリのオブジェクトはNewしてないのになぜ使えるのか?ですが、調べてもよくわかりませんでした(調べ方が悪かったかも)。エクセルがアプリケーションとして機能するために既にインスタンス化されているんだと勝手に解釈しています。
ただ、デフォルトで参照されているライブラリ全てがインスタンス(インスタンス化されたクラス)ではないようです。VBAライブラリのCollectionオブジェクトがその例です。Collectionオブジェクトを使用するとき、参照設定は不要ですが、Newは必要です。
Set obj = Nothing
この記述、時と場合によっては不要です。興味のある方、理解を深めたい人は他サイトをググって下さい。色々な方の見解が見られて面白いです。そうでない人は取り合えず記述しておいて間違いはありません。
Newで指定するオブジェクト名
Newキーワードで指定するオブジェクト名ですが、大体の場合はVBEのオブジェクトブラウザーで確認できるオブジェクト名(クラス)で大丈夫ですが、そうでないケースもあります。
オブジェクト名が他のライブラリと被っているとアプリケーション名も必要になります。サンプルのApplicationオブジェクトがそうですが、省略するとExcel.Applicationを参照してエラーが出ます。
当サイトで使用したオブジェクト名はサンプルコードを残していきますが、そうでないものは…「参照設定 ライブラリ名 オブジェクト名」でググるか、このサイトでお目当てのオブジェクト名が見つかるかも知れません。
CreateObject関数
CreateObject関数を使うことでも外部ライブラリのオブジェクトを扱う事ができます。
CreateObject関数を使用するときのコードサンプル
参照設定と違い、コード上で外部参照を完結できます(参照設定のような事前準備は不要)。
Dim アウトルック as Object
Set アウトルック = CreateObject("Outlook.Application")
'Outlook.Applicationオブジェクトを使用した処理を記述
Set アウトルック = Nothing
Dim dicオブジェクト As Object
Set dicオブジェクト = CreateObject("Scripting.Dictionary")
'Dictionaryオブジェクトを使用した処理を記述
Set dicオブジェクト = Nothing
CreateObject関数の引数
参照設定とCreateObject関数では指定するオブジェクト名の書き方が違います。但し、同じ場合もあります(ややここしい)。とても覚えきれないし、ヘルプ内をオブジェクト名で検索しても簡単には見つからない事が多いです。
参照設定同様、ネットで検索するか調査してくれているサイトをブックマークするのが手っ取り早いです。
参照設定とCreateObject関数の違い
当サイトでは外部ライブラリを使用するコードを紹介する場合、CreateObject関数で記述していますが推奨は参照設定です。理由は後述します。
参照設定のメリット
正確には、「参照設定すると変数宣言で特定のオブジェクト型を指定する(As Objectではない)」のでインテリセンス(入力支援機能)が有効になります。参照設定自体はインテリセンスの有無に直接関わっていません。
インテリセンス同様、変数宣言による理由で事前バインディングになります。詳しくはこのサイトで。
CreateObject関数のメリット
ファイルではなくコードを共有する場合、参照設定ありだとその設定方法も共有する必要があります。CreateObject関数ではその必要がありません。ライブラリさえインストールされていれば、コードのみでマクロが機能します。
ファイルを共有する場合はファイルに参照設定が保存されるので、特に意識する必要はありません。
当サイトの他ページで紹介しているサンプルコードがCreateObject関数を使用しているのもこれが理由です。せっかちな人がコピペだけしてページ離脱、参照設定しない、といったケースが想定されるので。
参照設定は事前バインディングになるので、エラー(参照設定されていない等)があるとマクロが起動しません。
CreateObject関数は実行時バインディングになるのでエラーハンドリング(エラー発生時に処理を停止しないで別の処理を行う)が可能です。マクロの内容によっては有効なケースもあると思います。
- 参照設定
- インテリセンスが有効になる
- 事前バインディングになる(実行時バインディングよりは処理が早い)
- CreateObject関数
- コードのみで完結する(ライブラリに関する設定を変える必要がない)
- エラーハンドリングできる
特段の理由がない限り、インテリセンスが有効になる参照設定推奨です。CreateObject関数を使うことによって得られるメリットが大きい場合はもちろん、それを妨げるものではありません。
サンプル
外部ライブラリを使用したマクロのサンプルです。興味がある人はこちらもご覧ください。