1/31追記 お詫び
以下の記事はレジストリを辿ってCreateObjectと参照設定を相互に調べる方法を書いていますが、IEなどごく一部のアプリにしか適用できないことが分かりました。つまり、あまり有用なテクニックではありません。はやとちりですみません。
一応、参考情報として消さずに置いておきます。
訂正記事はこちら
thom.hateblo.jp
VBAでオートメーションを扱う場合、参照設定する方法と、CreateObjectでオブジェクトを作る場合がある。
ネットのサンプルはどちらか片方で書かれているケースも多く、もう片方の方法が知りたいときもある。
そこで今回は、ネットの情報に頼らずとも自分でこれらの相互変換ができるように、その調査方法をお伝えする。
ただし、レジストリエディタを使用する為、細心の注意が必要だ。一度もレジストリエディタを使ったことが無ければ、他のサイトで概要くらいは押さえておいた方が良い。
目次
- 参照設定の説明
- CreateObjectの説明
- CreateObjectから参照設定を知りたい場合
- 参照設定名からCreateObjectを知りたい場合
- GUIDを直接指定してCreateObjectする方法
参照設定の説明
参照設定は別名「事前バインディング」または「アーリーバインディング」と呼ばれ、コーディング中にオブジェクトのメンバー入力候補が表示されるなど、便利にコーディングできる。また、オブジェクト固有の定数を使用できるため、コードが分かりやすくなる。
たとえば、IEを参照設定しみてよう。
VBEのツール→参照設定から、Microsoft Internet Controlを探し、チェックを付けてOKで閉じる。
すると、Dim IE As inまで入力した時点で、型名の候補にInternetExplorerが表示される。
また、ie.と入力すると、使用できるメンバの一覧が入力候補として表示される。
さらに、プロパティに対して比較演算子を入力すると、定数の一覧も表示してくれる。
CreateObjectの説明
CreateObjectでオブジェクトを作る方法は、「実行時バインディング」または「遅延バインディング」、「レイトバインディング」などと呼ばれ、実行するまで型は分からないのでVBエディタによるサポートは得られない。
しかし、参照設定不要でコードだけで完結するため、ネットにサンプルを掲載する際などは、「○○を参照設定してください」などと書く必要がなく、単にサンプルコードを張り付ければ動くというメリットもある。
また、VBScriptではそもそも参照設定が使用できないため、CreateObjectによる実行時バインディングしか存在しない。
サンプルはこちら。
Sub Test() Dim IE As Object Set IE = CreateObject("InternetExplorer.Application") IE.Visible = True IE.Navigate "google.co.jp" Do While IE.Busy Or IE.ReadyState <> 4 DoEvents Loop MsgBox "Googleを表示しました。" End Sub
CreateObjectから参照設定を知りたい場合
IE操作などの比較的有名なオートメーションであれば情報は豊富にあるが、ちょっとマニアックなオートメーションになると情報に乏しいため自分で調べる方法を押さえておくとよい。
とりあえず、CreateObject("InternetExplorer.Application")に相当する参照設定が何なのか調べたい場合を想定し、説明をすすめる。
レジストリエディタを使用するため、操作を誤るとWindowsを壊してしまうことがある。十分に注意されたい。
まずWindowsキーとRキーを同時に押し、ファイル名を指定して実行のウインドウに「regedit」と入力してEnterする。
警告が表示されるが、「はい」で続行するとレジストリエディタが起動する。
HKEY_CLASSES_ROOTをプラスマークで展開する。
だいぶ下にスクロールすると、IntenetExplorer.Applicationが見つかるので、プラスで展開し、CLSIDを開く。
※エディタ下部のステータスバーに現在のパスが書かれているので間違えないように確認すること。
右ペインの「規定」をダブルクリックすると、GUIDという長いIDが表示されるのでクリップボードにコピーし、キャンセルで閉じる。
ここで操作を誤って書き換えてしまわないよう注意。
私の環境では、このようなGUIDがとれた→{0002DF01-0000-0000-C000-000000000046}
もう一度HKEY_CLASSES_ROOTに戻り、Ctrl+Fで検索ウインドウを出してこの値を検索する。
その際、検索対象をキーだけにして完全一致にしておくと効率が良い。
HKEY_CLASSES_ROOT\CLSIDの配下のキーとして検索ヒットするはずなので、その配下のTypeLibを選択する。
右ペインの規定をダブルクリックし、同じ要領でGUIDをクリップボードにコピーしてキャンセルで閉じる。
またHKEY_CLASSES_ROOTに戻り、今クリップしたGUIDでキーを検索する。
すると、HKEY_CLASSES_ROOT\TypeLib内のGUIDがヒットするので、その配下のバージョン番号のようなキーを開き、右ペインに表示されている値が、参照設定するライブラリ名である。
参照設定名からCreateObjectを知りたい場合
先ほどと逆の操作をすればよい。
HKEY_CLASSES_ROOTで「Microsoft Internet Controls」をデータとして検索する。
するとTyleLibで検索がヒットする。
親のキーを右クリックし、キー名のコピーでGUIDをクリップボードに入れる。
このままではキーのフルパスとしてコピーされるので、一旦メモ帳などに張り付け、GUIDだけをコピーしなおす。
それからHKEY_CLASSESS_ROOTでGUIDを値として検索する。
すると、HKEY_CLASSES_ROOT\CLSID\{GUID}\TypeLib内のデータとしてヒットするので、親キーをコピーして同じようにメモ帳でGUIDだけ取り出す。
すると、HKEY_CLASSES_ROOT\[プログラムID]\CLSID内でヒットするので、その親キー名がCreateObjectで指定できるプログラムIDである。
GUIDを直接指定してCreateObjectする方法
CreateObjectには通常、HKEY_CLASSES_ROOT配下のクラスID(たとえばInternetExplorer.Application)を使用するが、
クラスのGUIDを指定してCreateObjectすることもできる。
HKEY_CLASSES_ROOT\InternetExplorer.Applicaiton\CLSIDの規定の値を取得し、
このようにnew:{GUID}をCreateObjectする。
Sub Test() Dim IE As Object Set IE = CreateObject("new:{0002DF01-0000-0000-C000-000000000046}") IE.Visible = True End Sub
するとIEが起動する。
ちなみに、クリップボードを扱うDataObjectはMicrosoft Forms 2.0 Object Libraryを参照設定することで使用できるが、これはプログラムIDが設定されていないため、CreateObjectで扱うにはGUIDを直指定する必要がある。
CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
参考:http://akihitoyamashiro.com/VBA/LateBindingDataObject.htm