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 番目のインスタンスにアタッチされます。
そのインスタンス内の開いているドキュメントの名前がわかっている場合は、特定のインスタンスにアタッチできます。 たとえば、Excel のインスタンスが Book2 という名前の開いているブックで実行されている場合、次のコードは、起動された最も古いインスタンスではない場合でも、そのインスタンスに正常にアタッチされます。
Set xlApp = GetObject("Book2").Application
CreateObject
CreateObject は、Automation サーバーの新しいインスタンスを開始するために使用されます。 例:
set xlApp = CreateObject("Excel.Application")
サーバーが SingleUse または MultiUse として設計されているかどうかに応じて、別のサーバー プロセスが起動される場合と起動されない場合があります。 これは、Automation インスタンスを強制的にシャットダウンする必要があるかどうかを判断するための重要な違いかもしれません。 たとえば、MultiUse サーバーでは、アタッチする前にインスタンスが既に実行されている場合は、自動化が完了したときにプログラムによってサーバーをシャットダウンしないようにする必要があります。
次の表は、Microsoft Office でソリューションを実装する際に役立つリファレンスとして役立ちます。 これは、サーバーの起動時に既定で表示されるかどうか、SingleUse または MultiUse の場合、UserControl プロパティがある場合、Quit メソッドがある場合、メイン ウィンドウのクラス名など、Microsoft Office のさまざまなバージョンとアプリケーションの動作と属性を一覧表示します。
アプリケーション | 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.Document などのその他の ProgID は OLE (オブジェクト リンクと埋め込み) で使用することを目的としており、CreateObject で使用すると一貫性のない結果が得られます。 Application ProgID を使用すると、(埋め込みではなく) Automation 用のサーバーを明示的に起動することで、潜在的な問題を回避できます。
Automation サーバーの使用が完了したら、そのサーバーへの参照をすべて解放し、サーバーが予期したとおりにシャットダウンされるように、Quit メソッド (使用可能な場合) を呼び出します。 Automation を使用してインスタンスを構成し、ユーザーが使用できるように開いたままにする場合は、UserControl プロパティを TRUE に設定してから、すべての参照を解放する必要があります。 その後、サーバーは (UserControl プロパティが TRUE であるため) 実行を続け、(未処理の参照がないため) ユーザーがアプリケーションを閉じるときに適切にシャットダウンします。
メモ Word の場合、UserControl プロパティは読み取り専用です。 True または False に設定することはできません。 最後の参照がリリースされると、Word は常に実行されたままです。
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示