概要

VBAでは、参照設定またはCreateObjectにより機能拡張を図ることができる。ここでは、この2つの違いや、相互変換について説明する。

参照設定

参照設定は別名「事前バインディング」「アーリーバインディング」とも呼ばれる。
コーディング中にメンバー入力候補が表示(インテリセンス)されたり、オブジェクト内の型・定数が使えるなどのメリットがある。
また、後で紹介する遅延バインディングよりも若干実行速度も速い。

CreateObject

一方、CreateObjectでオブジェクトを作成する方法は、「実行時バインディング」「遅延バインディング」「レイトバインディング」と呼ばれる。
遅延バインディングでは、実行するまで型が確定しないため、VBエディタによる入力サポートが得られないデメリットがある。
ただ、ネット上に掲載するコードサンプル等では、わずらわしい参照設定が不要というメリットがある。
また、VBScriptはそもそも参照設定が使えないため、CreateObjectによる遅延バインディングのみ可能である。

参照設定とCreateObjectの相互変換

CreateObjectから参照設定

ところで、CreateObject()にはProgIDと呼ばれる識別子を渡すが、
これに該当する参照設定がどれなのかはどうやったら分かるのだろうか?実はこれは簡単には分からない。レジストリを調べる必要がある。

  • コマンドプロンプトで「regedit」と入力してレジストリエディタを起動する
  • HKEY_CLASSES_ROOTを展開する。
  • この中から該当のProgIDのキーを探して展開する。
  • 「CLSID」を開いて、(既定)のデータを取得する。
  • 「HKEY_CLASSES_ROOT\CLSID」の中から該当のキーを検索する。
  • 「TypeLib」を開いて、(既定)のデータを取得
  • 「HKEY_CLASSES_ROOT\TypeLib」の中から該当のキーを検索する
    バージョン番号が付いたキーを開いて(既定)のデータがライブラリ名となる。

 

注意事項

※ただし、この手法は、すべての場合に当てはまるわけではないようなので注意が必要である。

例として、WordのProgID「Word.Application」を使って参照設定を逆引きしてみよう。

 

まず、CLSIDは、{000209FF-0000-0000-C000-000000000046}であることが分かる。

次にこれを検索してみると、以下のキーが見つかる。

HKEY_CLASSES_ROOT\CLSID\{000209FF-0000-0000-C000-000000000046}

しかし、この中には「TypeLib」キーが存在しない。(逆引き失敗)

参照設定からCreateObject

逆に参照設定名(ライブラリ名)からCreateObjectに渡すProgIDを調べる場合は、
上記と逆の手順をたどることになる。

参考

 

追記

TypeLibまでたどることさえできれば参照設定名が分かるのだが、残念ながらすべてには当てはまらないようだ。こうなると、逆にTypeLibからCLSIDを辿ることもできない。
では、もうお手上げなのだろうか?
いや、そんなことはない。参照設定にしろCreateObjectにしろ、最終的にはライブラリを一意に特定する必要があるのだから、なんらかの方法があるはずである。

その答えがここに書いてあった。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です