プログラムのドキュメントレベルのカスタマイズ

ドキュメント レベルのカスタマイズを使用して、Microsoft Office Word または Microsoft Office Excel を拡張する場合に、次のタスクを実行できます。

  • オブジェクト モデルを使用してアプリケーションを自動化します。

  • ドキュメントの画面にコントロールを追加します。

  • カスタマイズ アセンブリから、ドキュメント内に Visual Basic for Applications (VBA) コードを呼び出します。

  • VBA からカスタマイズ アセンブリ内のコードを呼び出します。

  • Microsoft Office がインストールされていないサーバー上にドキュメントがあるときに、そのドキュメントの特定の要素を管理します。

  • アプリケーションのユーザー インターフェイス (UI) をカスタマイズします。

    適用対象: このトピックの情報は、Excel および Word のドキュメント レベルのプロジェクトに適用されます。 詳細については、「Office アプリケーションおよびプロジェクトの種類別の使用可能な機能」を参照してください。

    ドキュメント レベルのプロジェクトのコードの記述には、Visual Studio の他のプロジェクトの種類とは異なる点があります。 相違点の多くは、Office オブジェクト モデルがマネージド コードに公開される方法に起因しています。 詳しくは、「Office ソリューションでコードを書く」をご覧ください。

    ドキュメントレベルのカスタマイズと、Visual Studio の Office 開発ツールを使用して作成できる他の種類のソリューションについては、「Office ソリューションの開発の概要 (VSTO)」を参照してください。

ドキュメントレベルのプロジェクトで生成されるクラスを使用する

ドキュメント レベルのプロジェクトを作成するときに、Visual Studio は、コードの記述を開始できるプロジェクト クラスを自動的に生成します。 Visual Studio は、Word と Excel 用のさまざまなクラスを生成します。

  • Word 用のドキュメント レベルのプロジェクトでは、クラスは既定で ThisDocument と呼ばれます。

  • Excel 用のドキュメント レベルのプロジェクトには、生成されたクラスが複数あり、ワークブック自体のために 1 つ、各ワークシート用に 1 つずつです。 既定では、それらのクラスの名前は次のようになります。

    • ThisWorkbook

    • Sheet1

    • Sheet2

    • Sheet3

    生成されたクラスには、ドキュメントを開いたり閉じたりしたときに呼び出されるイベント ハンドラーが含まれています。 ドキュメントを開いたときにコードを実行するには、 Startup イベント ハンドラーにコードを追加します。 ドキュメントを閉じたときにコードを実行するには、 Shutdown イベント ハンドラーにコードを追加します。 詳細については、「Office プロジェクトのイベント」を参照してください。

生成されたクラスの設計を理解する

.NET Framework 4 または .NET Framework 4.5 を対象とするプロジェクトでは、Visual Studio Tools for Office ランタイムのホスト項目の種類はインターフェイスであるため、生成されたクラスはそれらから実装を派生させることはできません。 代わりに、生成されたクラスでは、次の基本クラスからそのほとんどのメンバーが派生します。

  • ThisDocument: DocumentBaseから派生します。

  • ThisWorkbook: WorkbookBaseから派生します。

  • Sheetn: WorksheetBase から派生します。

    これらの基本クラスは、そのメンバーのすべての呼び出しを Visual Studio Tools for Office ランタイムの対応するホスト項目インターフェイスの内部実装にリダイレクトします。 たとえば、 Protect クラスの ThisDocument メソッドを呼び出す場合、 DocumentBase クラスはこの呼び出しを Visual Studio Tools for Office ランタイムの Document インターフェイスの内部実装にリダイレクトします。

ホスト アプリケーションのオブジェクト モデルにアクセスする

ホスト アプリケーションのオブジェクト モデルにアクセスするには、プロジェクト内で生成されたクラスのメンバーを使用します。 これらの各クラスは Excel または Word のオブジェクト モデル内のオブジェクトに対応しており、同じプロパティ、メソッド、およびイベントのほとんどが含まれています。 たとえば、Word のドキュメント レベルのプロジェクトの ThisDocument クラスは、Word オブジェクト モデルの Document オブジェクトとほとんど同じメンバーを提供します。

次のコード例では、Word オブジェクト モデルを使用して、Word のドキュメント レベルのカスタマイズの一部であるドキュメントを保存する方法を示します。 この例は ThisDocument クラスから実行することを意図しています。

this.Save();

同じ処理を ThisDocument クラスの外から行うには、 Globals オブジェクトを使用して ThisDocument クラスにアクセスします。 たとえば、[操作] ウィンドウ UI に [保存] ボタンUI を組み込む場合は、このコードを [操作] ウィンドウのコード ファイルに追加します。

Globals.ThisDocument.Save();

ThisDocument クラスはそのほとんどのメンバーを Document ホストの項目から取得するので、実際には、このコードで呼び出される Save メソッドは Save ホスト項目の Document メソッドです。 このメソッドは、Word オブジェクト モデルの Save オブジェクトの Document メソッドに対応しています。

Word と Excel のオブジェクト モデルの使用方法の詳細については、「Word オブジェクト モデルの概要」と「Excel オブジェクト モデルの概要」を参照してください。

Globals オブジェクトについて詳しくは、「Office プロジェクト内のオブジェクトへのグローバル アクセス」をご覧ください。

ドキュメントにコントロールを追加する

ドキュメントの UI をカスタマイズするには、Windows フォーム コントロールまたは ホスト コントロール をドキュメントの画面に追加します。 さまざまな種類のコントロールを組み合わせ、コードを記述すると、コントロールをデータにバインドしたり、ユーザーから情報を収集したり、ユーザーの操作に応答したりできます。

ホスト コントロールは Word オブジェクト モデルと Excel オブジェクト モデルの一部のオブジェクトを拡張するクラスです。 たとえば、 ListObject ホスト コントロールには、Excel の ListObject のすべての機能が用意されています。 ただし、 ListObject ホスト コントロールには追加のイベントやデータ バインディング機能もあります。

詳細については、「ホスト項目とホスト コントロールの概要」と「Office ドキュメントでの Windows フォーム コントロールの概要」を参照してください。

VBA とドキュメントレベルのカスタマイズを結合する

ドキュメント レベルのカスタマイズの一部であるドキュメントに VBA コードを使用できます。 カスタマイズ アセンブリからドキュメント内の VBA コードを呼び出したり、ドキュメント内の VBA コードがカスタマイズ アセンブリのコードを呼び出せるようにプロジェクトを構成したりすることができます。

詳細については、「VBA とドキュメントレベルのカスタマイズを結合する」を参照してください。

サーバー上のドキュメントを管理する

Microsoft Office Word または Microsoft Office Excel がインストールされていないサーバーで、ドキュメント レベルのカスタマイズのさまざまな要素を管理することができます。 たとえば、ドキュメントのデータ キャッシュにあるデータにアクセスし、変更することができます。 また、ドキュメントに関連付けられているカスタマイズ アセンブリも管理できます。 たとえば、プログラムを使用してドキュメントからアセンブリを削除して、ドキュメントがコードを実行しないようにしたり、プログラムを使用してアセンブリをドキュメントにアタッチすることができます。

詳細については、「ServerDocument クラスを使用してサーバー上のドキュメントを管理する」を参照してください。

Microsoft Office アプリケーションのユーザー インターフェイスをカスタマイズする

ドキュメント レベルのカスタマイズを使用して、次の方法で、Excel や Word の UI をカスタマイズできます。

ドキュメントレベルのカスタマイズでのネイティブ Office オブジェクトから拡張オブジェクトを取得する

Office イベントの多くのイベント ハンドラーでは、イベントが発生するワークブック、ワークシート、またはドキュメントを表すネイティブの Office オブジェクトを受け取ります。 場合によっては、いくつかのコードはドキュメント レベルのカスタマイズでワークブックやドキュメントによってイベントが発生した場合のみ実行します。 たとえば、Excel のドキュメント レベルのカスタマイズでは、カスタマイズされたワークブック内でワークシートを 1 つアクティブ化したときに一部のコードを実行し、同時に開いている他のワークブックでワークシートをアクティブ化したときには実行しないようにします。

ネイティブの Office オブジェクトがある場合は、そのオブジェクトがドキュメント レベルのカスタマイズで ホスト項目 または ホスト コントロール に拡張されているかどうかをテストできます。 ホスト項目およびホスト コントロールは Word または Excel オブジェクト モデルにネイティブで存在するオブジェクト (ネイティブ Office オブジェクトと呼ばれる) に機能を追加する Visual Studio Tools for Office Runtime が提供する種類のインスタンスです。 総称して、ホスト項目とホスト コントロールは 拡張オブジェクトとも呼ばれます。 ホスト項目とホスト コントロールの詳細については、「ホスト項目とホスト コントロールの概要」を参照してください。

GetVstoObject メソッドと HasVstoObject メソッドを理解する

ネイティブの Office オブジェクトをテストするには、プロジェクト内で HasVstoObject メソッドと GetVstoObject メソッドを使用します。

  • カスタマイズでネイティブの Office オブジェクトに拡張オブジェクトがあるかどうかを判断するには、HasVstoObject メソッドを使用します。 このメソッドは、ネイティブの Office オブジェクトに拡張オブジェクトがある場合は true を返し、ない場合は false を返します。

  • ネイティブの Office オブジェクトに対する拡張オブジェクトを取得する場合は、GetVstoObject メソッドを使用します。 このメソッドは、指定したネイティブの Office オブジェクトに拡張オブジェクトがあれば、 ListObjectWorkbookWorksheet、または Document オブジェクトを返します。 それ以外の場合、GetVstoObjectnull を返します。 たとえば、GetVstoObject メソッドは、指定した Document が Word ドキュメント プロジェクトのドキュメントで基礎となるオブジェクトの場合、Document を返します。

    ドキュメントレベルのプロジェクトでは、実行時に GetVstoObject メソッドを使用して新しい WorkbookWorksheet、または Document ホスト項目を作成することはできません。 このメソッドは、デザイン時にプロジェクトで生成される既存のホスト項目へのアクセスにのみ使用できます。 実行時に新しいホスト項目を作成する場合は、VSTO アドイン プロジェクトを開発する必要があります。 詳細については、「ホスト項目とホスト コントロールのプログラム上の制限事項」と「実行時に VSTO アドインで Word 文書と Excel ブックを拡張する」を参照してください。

GetVstoObject メソッドと HasVstoObject メソッドを使用する

HasVstoObject メソッドと GetVstoObject メソッドを呼び出すには、Globals.Factory.GetVstoObject メソッドまたは Globals.Factory.HasVstoObject メソッドを使用して、テストするネイティブの Word オブジェクトまたは Excel オブジェクト (DocumentWorksheet など) に渡します。