Office オートメーション サーバーの GetObject と CreateObject の動作

概要

この記事では、さまざまなバージョンの Microsoft Office アプリケーションで GetObject 関数と CreateObject 関数を使用するときに発生するさまざまな動作について説明します。

GetObject と CreateObject は、Microsoft Visual Basic と Microsoft Visual Basic for Applications (VBA) によって提供される関数です。 ただし、GetObject への参照を GetActiveObject API の呼び出しとして扱い、CreateObject への参照を CoCreateInstanceAPI の呼び出しとして扱う場合は、この情報もMicrosoft Visual C++に適用できます。

詳細情報

GetObject

GetObject は、オートメーション サーバーの実行中のインスタンスにアタッチするために使用されます。 GetObject を呼び出す方法はいくつかありますが、Microsoft Office アプリケーションに推奨される構文は次のとおりです。

set xlApp = GetObject(, "Excel.Application")

このコードの実行時に Microsoft Excel のインスタンスが実行されている場合は、xlApp 変数を使用して実行中のインスタンスのオブジェクト モデルにアクセスできます。 実行中のインスタンスがない場合は、次のトラップ可能な実行時エラー メッセージが表示されます。

Run-time error '429':
ActiveX component can't create object  

Microsoft Excel の複数のインスタンスが実行されている場合、GetObject は最初に起動されたインスタンスにアタッチします。 その後、最初のインスタンスを閉じると、GetObject への別の呼び出しが、起動された 2 番目のインスタンスにアタッチされます。

そのインスタンス内の開いているドキュメントの名前がわかっている場合は、特定のインスタンスにアタッチできます。 たとえば、ブック 2 という名前の開いているブックで Excel のインスタンスが実行されている場合、次のコードは、起動された最も古いインスタンスではない場合でも、そのインスタンスに正常にアタッチされます。

Set xlApp = GetObject("Book2").Application

CreateObject

CreateObject は、Automation サーバーの新しいインスタンスを開始するために使用されます。 例:

set xlApp = CreateObject("Excel.Application")

サーバーが SingleUse または MultiUse として設計されているかどうかに応じて、別のサーバー プロセスが起動される場合と起動されない場合があります。 これは、Automation インスタンスを強制的にシャットダウンする必要があるかどうかを判断するための重要な違いかもしれません。 たとえば、MultiUse サーバーの場合、アタッチする前にインスタンスが既に実行されている場合は、自動化が完了したときにプログラムによってサーバーをシャットダウンしないようにする必要があります。

次の表は、Microsoft Office でソリューションを実装する際に役立つリファレンスとして役立ちます。 これは、Microsoft Office のさまざまなバージョンとアプリケーションの動作と属性を一覧表示します。たとえば、サーバーの起動時に既定で表示されるかどうか、SingleUse または MultiUse の場合、UserControl プロパティがある場合、Quit メソッドがある場合は、そのメイン ウィンドウのクラス名が表示されます。

アプリケーション Visible インスタンス UserControl を持つ QuitClassName を持つ クラス名
Excel 97、2000、2002、2003、2007 不要 SingleUse はい はい XlMain
Word 97、2000、2002、2003、2007 いいえ SingleUse はい はい OpusApp
PowerPoint 97 不要 MultiUse 不要 はい PP97FrameClass
PowerPoint 2000 不要 MultiUse 不要 はい PP9FrameClass
PowerPoint 2002 不要 MultiUse 不要 はい PP10FrameClass
PowerPoint 2003 不要 MultiUse 不要 はい PP11FrameClass
PowerPoint 2007 不要 MultiUse 不要 はい PP12FrameClass
Access 97 はい SingleUse はい はい OMain
Access 2000、2002、2003、2007 不要 SingleUse はい はい OMain
Project 98, 2000 いいえ MultiUse はい はい JWinproj-WhimperMainClass

メイン ウィンドウ クラス名は、インスタンスが既に実行されている場合に便利に調べる場合に FindWindow API を呼び出すのに役立ちます。 UserControl プロパティは、最後の参照が解放されたときにサーバー アプリケーションが自動的にシャットダウンするかどうかを示すブール型のプロパティです (何も設定されていません)。 Quit メソッドを使用すると、必要な場合 (最後の参照が解放された後にインスタンスがシャットダウンされない場合など) に UserControl プロパティをオーバーライドできます。

一般に、Microsoft では、ユーザーが使用している可能性があるインスタンスにアタッチするのではなく、Office アプリケーションの新しいインスタンスを使用することをお勧めします。 Application ProgID を使用してインスタンスを作成し、そこから新しいオブジェクトを開くか作成することをお勧めします。 Excel.Sheet や Word など、その他の ProgID。ドキュメントなどは、OLE (オブジェクト リンクと埋め込み) で使用することを目的としており、CreateObject で使用すると一貫性のない結果が得られます。 Application ProgID を使用すると、(埋め込みではなく) Automation 用のサーバーを明示的に起動することで、潜在的な問題を回避できます。

Automation サーバーの使用が完了したら、そのサーバーへの参照をすべて解放し、サーバーが予期したとおりにシャットダウンされるように、Quit メソッド (使用可能な場合) を呼び出します。 Automation を使用してインスタンスを構成し、ユーザーが使用できるように開いたままにする場合は、UserControl プロパティを TRUE に設定してから、すべての参照を解放する必要があります。 その後、サーバーは (UserControl プロパティが TRUE であるため) 実行を続け、(未処理の参照がないため) ユーザーがアプリケーションを閉じるときに適切にシャットダウンします。

メモWordの場合、UserControl プロパティは読み取り専用です。 True または False に設定することはできません。 Wordは、最後の参照が解放されたときに常に実行されたままです。