t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

VBA CreateObjectか参照設定のどちらかしか分からないとき、もう片方を調べる方法(NG)

1/31追記 お詫び
以下の記事はレジストリを辿ってCreateObjectと参照設定を相互に調べる方法を書いていますが、IEなどごく一部のアプリにしか適用できないことが分かりました。つまり、あまり有用なテクニックではありません。はやとちりですみません。
一応、参考情報として消さずに置いておきます。

訂正記事はこちら
thom.hateblo.jp


VBAでオートメーションを扱う場合、参照設定する方法と、CreateObjectでオブジェクトを作る場合がある。
ネットのサンプルはどちらか片方で書かれているケースも多く、もう片方の方法が知りたいときもある。

そこで今回は、ネットの情報に頼らずとも自分でこれらの相互変換ができるように、その調査方法をお伝えする。
ただし、レジストリエディタを使用する為、細心の注意が必要だ。一度もレジストリエディタを使ったことが無ければ、他のサイトで概要くらいは押さえておいた方が良い。

目次

参照設定の説明

参照設定は別名「事前バインディング」または「アーリーバインディング」と呼ばれ、コーディング中にオブジェクトのメンバー入力候補が表示されるなど、便利にコーディングできる。また、オブジェクト固有の定数を使用できるため、コードが分かりやすくなる。

たとえば、IEを参照設定しみてよう。
VBEのツール→参照設定から、Microsoft Internet Controlを探し、チェックを付けてOKで閉じる。
f:id:t-hom:20160130152905p:plain

すると、Dim IE As inまで入力した時点で、型名の候補にInternetExplorerが表示される。
f:id:t-hom:20160130153051p:plain

また、ie.と入力すると、使用できるメンバの一覧が入力候補として表示される。
f:id:t-hom:20160130153237p:plain

さらに、プロパティに対して比較演算子を入力すると、定数の一覧も表示してくれる。
f:id:t-hom:20160130153527p:plain

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する。
f:id:t-hom:20160130155011p:plain

警告が表示されるが、「はい」で続行するとレジストリエディタが起動する。
f:id:t-hom:20160130155204p:plain

HKEY_CLASSES_ROOTをプラスマークで展開する。
f:id:t-hom:20160130155246p:plain

だいぶ下にスクロールすると、IntenetExplorer.Applicationが見つかるので、プラスで展開し、CLSIDを開く。
※エディタ下部のステータスバーに現在のパスが書かれているので間違えないように確認すること。
f:id:t-hom:20160130155529p:plain

右ペインの「規定」をダブルクリックすると、GUIDという長いIDが表示されるのでクリップボードにコピーし、キャンセルで閉じる。
f:id:t-hom:20160130155737p:plain

ここで操作を誤って書き換えてしまわないよう注意。

私の環境では、このようなGUIDがとれた→{0002DF01-0000-0000-C000-000000000046}

もう一度HKEY_CLASSES_ROOTに戻り、Ctrl+Fで検索ウインドウを出してこの値を検索する。
その際、検索対象をキーだけにして完全一致にしておくと効率が良い。
f:id:t-hom:20160130160403p:plain

HKEY_CLASSES_ROOT\CLSIDの配下のキーとして検索ヒットするはずなので、その配下のTypeLibを選択する。
f:id:t-hom:20160130160648p:plain

右ペインの規定をダブルクリックし、同じ要領でGUIDをクリップボードにコピーしてキャンセルで閉じる。
f:id:t-hom:20160130160842p:plain

またHKEY_CLASSES_ROOTに戻り、今クリップしたGUIDでキーを検索する。
f:id:t-hom:20160130161005p:plain

すると、HKEY_CLASSES_ROOT\TypeLib内のGUIDがヒットするので、その配下のバージョン番号のようなキーを開き、右ペインに表示されている値が、参照設定するライブラリ名である。
f:id:t-hom:20160130161145p:plain

参照設定名からCreateObjectを知りたい場合

先ほどと逆の操作をすればよい。
HKEY_CLASSES_ROOTで「Microsoft Internet Controls」をデータとして検索する。
f:id:t-hom:20160130162305p:plain

するとTyleLibで検索がヒットする。
f:id:t-hom:20160130162429p:plain

親のキーを右クリックし、キー名のコピーでGUIDをクリップボードに入れる。
f:id:t-hom:20160130162537p:plain

このままではキーのフルパスとしてコピーされるので、一旦メモ帳などに張り付け、GUIDだけをコピーしなおす。
f:id:t-hom:20160130162726p:plain

それからHKEY_CLASSESS_ROOTでGUIDを値として検索する。
f:id:t-hom:20160130162818p:plain

すると、HKEY_CLASSES_ROOT\CLSID\{GUID}\TypeLib内のデータとしてヒットするので、親キーをコピーして同じようにメモ帳でGUIDだけ取り出す。
f:id:t-hom:20160130162953p:plain

すると、HKEY_CLASSES_ROOT\[プログラムID]\CLSID内でヒットするので、その親キー名がCreateObjectで指定できるプログラムIDである。
f:id:t-hom:20160130163319p:plain

GUIDを直接指定してCreateObjectする方法

CreateObjectには通常、HKEY_CLASSES_ROOT配下のクラスID(たとえばInternetExplorer.Application)を使用するが、
クラスのGUIDを指定してCreateObjectすることもできる。
HKEY_CLASSES_ROOT\InternetExplorer.Applicaiton\CLSIDの規定の値を取得し、
f:id:t-hom:20160130155737p:plain

このように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

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。