オブジェクト変数を宣言する

Microsoft Office 2000/Visual Basic プログラマーズ ガイド   

アプリケーションのタイプ ライブラリによって公開されるオブジェクトを別のアプリケーションで使用するには、そのタイプ ライブラリに含まれている情報を認識する必要があります。ほかのアプリケーションによって公開されたオブジェクト、メソッド、およびプロパティを照会するプロセスは "バインド" と呼ばれます。Office アプリケーションで VBA のプログラミングを行う場合、"事前バインディング" と "実行時バインディング" の 2 種類のバインドを実行できます。バインドを実行する方法およびタイミングによって、ソリューションのパフォーマンスは大きく影響を受けます。

アプリケーションまたはコンポーネントのタイプ ライブラリへの参照が確立されている場合は、事前バインディングを使用できます。実行時バインディングを使用した場合、VBA はデザイン時にアプリケーションのオブジェクトをタイプ ライブラリから直接取得するため、オブジェクト変数を特定の型として宣言することができます。たとえば、Word の文書で作業する際に Microsoft Word 9.0 オブジェクト ライブラリへの参照が確立されていると、Documents または Document 型などの Word 固有のデータ型を使用してオブジェクト変数を宣言することができます。事前バインディングでは、ソリューションの実行中に必要な情報の通信量が削減されるため、ソリューションのパフォーマンスを向上させることができます。

実行時に実行時バインディングは自動化されたアプリケーションに対してクエリを実行するため、総称オブジェクトまたはバリアント データ型 (Variant) を使用してオブジェクト変数を宣言できます。一般的に、特定のアプリケーションに対して機能する総称コードを記述する際に、作業しているオブジェクト型が実行時までわからない場合は、実行時バインディングを使用すると便利です。実行時にアプリケーションに対してクエリを実行するオーバーヘッドが追加されると、ソリューションのパフォーマンスが低下します。

メモ   オートメーションをサポートするアプリケーションおよびコンポーネントでは実行時バインディングのみがサポートされます。Office 2000 のすべてのアプリケーションおよび最近リリースされたアプリケーションのほとんどは、事前バインディングと実行時バインディングの両方をサポートします。ただし、VBScript および JavaScript などのスクリプト言語では、参照や特定のオブジェクト データ型 (たとえば VBScript ではバリアント データ型のみサポートされます) がサポートされないため、事前バインディングはサポートされません。

事前バインディングの宣言

事前バインディングを使用する場合、CreateObject または GetObject 関数を使用するか、そのアプリケーションがサポートする場合は New キーワードを使用してオブジェクト変数を初期化することができます。Office 2000 のすべてのアプリケーションは、New キーワードを使用して初期化することができます。Outlook 2000 の Outlook アイテムに対するプログラミング環境はスクリプトのみがサポートするため、VBScript プログラミング環境では事前バインディング宣言は使用できませんが、ローカルの Outlook VBA プロジェクトや COM アドインの VBA コード、または Outlook で機能する、別のホスト アプリケーションからのオートメーション コードで事前バインディングを使用できます。

事前バインディングは、C 言語のプログラマには仮想関数テーブル バインドまたは vtable バインドと呼ばれています。事前バインディングを使用するには、自動化するアプリケーションまたはサービスのオブジェクト、メソッド、プロパティ、およびイベントの種類に関する情報が含まれるタイプ ライブラリ (.tlb) またはオブジェクト ライブラリ、あるいは .exe、.dll、または .ocx ファイルのいずれかへの参照をホスト アプリケーションで作成する必要があります。

次のコードでは、Word (Word.Application) のプログラム識別子を使用して Application 変数が宣言され、New キーワードで Set ステートメントを使用して Word の新しいインスタンスが作成されます。

  Dim wdApp As Word.Application
Set wdApp = New Word.Application

上記のラインに続く次のコードによって Application オブジェクトの Visible プロパティが True に設定されない場合、Word の新しいインスタンスは表示されません。既定では、すべての Office アプリケーションは、ほかのアプリケーションから自動化されたときには表示されません。

可能な限り事前バインディングを使用してください。事前バインディングには次のような利点があります。

構文チェック   事前バインディングを使用すると、実行時ではなくコンパイル時に VBA がオブジェクト ライブラリに保存された構文に対してステートメントの構文を確認するため、デザイン時にエラーを検出することができます。たとえば、VBA は、オブジェクトのプロパティまたはメソッドが有効かどうか、およびそのプロパティとメソッドに有効な引数を渡しているかどうかを確認します。

ステートメント作成ツールのサポート   事前バインディングを使用すると、Visual Basic Editor では、オブジェクトのプロパティおよびメソッドの自動リスト作成や名前付き引数に関するポップアップ ヒントの表示など、コードの記述を簡易化し、エラーの削減に役立つ機能がサポートされます。

組み込み定数のサポート   事前バインディングを使用すると、コードがメソッドの引数およびプロパティ設定の組み込み定数を参照します。これは、デザイン時にタイプ ライブラリからこの情報を取得できるためです。実行時バインディングを使用する場合、アプリケーションの文書内の値を検索してコード内のこれらの定数を定義する必要があります。

パフォーマンスの向上   実行時バインディングに比べて、事前バインディングは優れたパフォーマンスを発揮します。

実行時バインディングされた宣言

実行時バインディングを使用すると、変数をオブジェクト データ型またはバリアント データ型 (Variant) として宣言することができます。変数は、GetObject または CreateObject 関数を呼び出し、アプリケーションのプログラム識別子を指定することによって初期化されます。たとえば、次のコードでは、Object 変数が宣言され、CreateObject 関数を使用して Access のインスタンスに設定されています。

  Dim objApp As Object
Set objApp = CreateObject("Access.Application")

実行時バインディングは、C 言語のプログラマには IDispatch バインドと呼ばれ、オートメーションを通じてほかのアプリケーションを制御可能なアプリケーションにインプリメントされた最初のバインド方法でした。このため、実行時バインディングは、アプリケーションの旧バージョンとの下位互換性を保持する場合に使用できます。ただし、実行時バインディングでは多くのオーバーヘッドを消費するためパフォーマンスに影響があり、ダイナミック データ エクスチェンジ (DDE) よりは速く動作しますが、事前バインディングよりは遅くなります。

ヒント   DDE は、OLE 以前に作成された、Windows アプリケーション間でデータを交換するプロトコルです。Office アプリケーション間ではオートメーションがサポートされているため、データ交換に DDE を使用する必要はありません。ただし、オートメーション コードをサポートしないほかのアプリケーションで Office アプリケーションのデータを使用する際、場合によっては DDE を使用する必要があります。DDE の詳細については、Visual Basic リファレンス ヘルプで目的の Office アプリケーションを検索してください。

また、スクリプトには事前バインディングをサポートするためにタイプ ライブラリへの参照を設立する方法がないため、オブジェクトを使用する際には、スクリプトのすべてのオートメーション コンポーネントから CreateObject 関数を使用する必要があります。