アプリケーション レベルのアドインにおける実行時の Word 文書や Excel ブックの拡張
アプリケーション レベルのアドインを使用して、以下のような Word 文書および Excel ブックのカスタマイズができます。
開いている文書またはワークシートにマネージ コントロールを追加する。
Windows フォームのデータ バインド モデルを使用して、Excel ワークシート上の既存のリスト オブジェクトを、イベントを公開し、データにバインドできる、拡張された ListObject に変換する。
Word および Excel によって、特定の文書、ブック、ワークシートに対して公開されている、アプリケーション レベルのイベントにアクセスする。
この機能を使用するには、実行時に文書またはブックを拡張するオブジェクトを作成します。
適用されます: は、このトピックの情報次のアプリケーションのアプリケーション レベルのプロジェクトを適用します: Excel 2010; Word 2010。詳細については、「Office アプリケーションおよびプロジェクト タイプ別の使用可能な機能」を参照してください。
アドインにおける拡張オブジェクトの生成
拡張オブジェクトは という語または Excel のオブジェクト モデルに生まれつきあるオブジェクト、機能を追加オフィスの下の Visual Studio Tools による型のインスタンスです (天然職場のオブジェクトと呼ばれる)。Word オブジェクトまたは Excel オブジェクト用に拡張オブジェクトを生成するには、GetVstoObject メソッドを使用します。指定した語または Excel のオブジェクトの GetVstoObject 方法を追加すると、指定したオブジェクトを拡張する新しいオブジェクトを返します。方法と呼ばれる、同じ Word または Excel のオブジェクトを指定するたびに、同じ拡張オブジェクトを返します。
拡張オブジェクトの型の名前は、ネイティブ Office オブジェクトの型と同じですが、型は Microsoft.Office.Tools.Excel 名前空間または Microsoft.Office.Tools.Word 名前空間で定義されています。たとえば、GetVstoObject メソッドを呼び出して Microsoft.Office.Interop.Word.Document オブジェクトを拡張する場合、このメソッドは Microsoft.Office.Tools.Word.Document オブジェクトを返します。
GetVstoObject メソッドは、主にアプリケーション レベルのプロジェクトで使用するためのものです。これらのメソッドをドキュメント レベルのプロジェクトで使用することもできますが、動作が異なり、ほとんど使用されません。
あるネイティブ Office オブジェクトに対して既に拡張オブジェクトが生成されているかどうかを判断するには、HasVstoObject メソッドを使用します。詳細については、「Office オブジェクトが拡張されているかどうかを判断する」を参照してください。
ホスト項目の生成
GetVstoObject を使用してドキュメント レベルのオブジェクト (Microsoft.Office.Interop.Excel.Workbook、Microsoft.Office.Interop.Excel.Worksheet、または Microsoft.Office.Interop.Word.Document) を拡張する場合、返されたオブジェクトはホスト項目と呼ばれます。ホスト項目は、他の拡張オブジェクトやコントロールなど、他のオブジェクトを格納できる型です。Word や Excel のプライマリ相互運用機能アセンブリの対応する型に似ていますが、追加の機能を備えています。ホスト項目の詳細については、「ホスト項目とホスト コントロールの概要」を参照してください。
ホスト項目を生成した後、ドキュメント、ファイル、またはワークシートに管理のコントロールを追加するために使用できます。詳細については、ドキュメントやワークシートに管理のコントロールの追加を参照してください。
Word 文書のホスト項目を生成するには
次のコード例は、有効なドキュメントのホスト項目を生成する方法を示します。
If Globals.ThisAddIn.Application.Documents.Count > 0 Then Dim NativeDocument As Microsoft.Office.Interop.Word.Document = _ Globals.ThisAddIn.Application.ActiveDocument Dim VstoDocument As Microsoft.Office.Tools.Word.Document = _ Globals.Factory.GetVstoObject(NativeDocument) End If
if (Globals.ThisAddIn.Application.Documents.Count > 0) { Microsoft.Office.Interop.Word.Document nativeDocument = Globals.ThisAddIn.Application.ActiveDocument; Microsoft.Office.Tools.Word.Document vstoDocument = Globals.Factory.GetVstoObject(nativeDocument); }
Excel ブックのホスト項目を生成するには
次のコード例は、有効なブックのホスト項目を生成する方法を示します。
Dim NativeWorkbook As Microsoft.Office.Interop.Excel.Workbook = Globals.ThisAddIn.Application.ActiveWorkbook If NativeWorkbook IsNot Nothing Then Dim vstoWorkbook As Microsoft.Office.Tools.Excel.Workbook = Globals.Factory.GetVstoObject(NativeWorkbook) End If
Microsoft.Office.Interop.Excel.Workbook nativeWorkbook = Globals.ThisAddIn.Application.ActiveWorkbook; if (nativeWorkbook != null) { Microsoft.Office.Tools.Excel.Workbook vstoWorkbook = Globals.Factory.GetVstoObject(nativeWorkbook); }
Excel ワークシートのホスト項目を生成するには
次のコード例では、プロジェクトの有効なワークシートのホスト項目を生成する方法を示します。
Dim NativeWorksheet As Microsoft.Office.Interop.Excel.Worksheet = Globals.ThisAddIn.Application.ActiveSheet If NativeWorksheet IsNot Nothing Then Dim vstoSheet As Microsoft.Office.Tools.Excel.Worksheet = Globals.Factory.GetVstoObject(NativeWorksheet) End If
Microsoft.Office.Interop.Excel.Worksheet nativeWorksheet = Globals.ThisAddIn.Application.ActiveSheet; if (nativeWorksheet != null) { Microsoft.Office.Tools.Excel.Worksheet vstoSheet = Globals.Factory.GetVstoObject(nativeWorksheet); }
ListObject ホスト コントロールの生成
GetVstoObject メソッドを使用して Microsoft.Office.Interop.Excel.ListObject を拡張する場合、このメソッドは Microsoft.Office.Tools.Excel.ListObject を返します。Microsoft.Office.Tools.Excel.ListObject には、元の Microsoft.Office.Interop.Excel.ListObject のすべての機能が備わっているだけでなく、Windows フォームのデータ バインド モデルを使用してデータにバインドできるなど、追加の機能も備わっています。詳細については、「ListObject コントロール」を参照してください。
ListObject のホスト コントロールを生成するには
次のコード例では、プロジェクトの有効なワークシートの最初の Microsoft.Office.Interop.Excel.ListObject の Microsoft.Office.Tools.Excel.ListObject を生成する方法を示します。
Dim sheet As Microsoft.Office.Interop.Excel.Worksheet = Globals.ThisAddIn.Application.ActiveSheet If sheet.ListObjects.Count > 0 Then Dim listObject As Excel.ListObject = sheet.ListObjects(1) Dim vstoListObject As Microsoft.Office.Tools.Excel.ListObject = Globals.Factory.GetVstoObject(listObject) End If
Microsoft.Office.Interop.Excel.Worksheet sheet = Globals.ThisAddIn.Application.ActiveSheet; if (sheet.ListObjects.Count > 0) { Excel.ListObject listObject = sheet.ListObjects[1]; Microsoft.Office.Tools.Excel.ListObject vstoListObject = Globals.Factory.GetVstoObject(listObject); }
文書とワークシートへのマネージ コントロールの追加
Microsoft.Office.Tools.Word.Document または Microsoft.Office.Tools.Excel.Worksheet を生成した後、これらの拡張オブジェクトが表す文書またはワークシートにコントロールを追加できます。これを行うには、Microsoft.Office.Tools.Word.Document または Microsoft.Office.Tools.Excel.Worksheet の Controls プロパティを使用します。詳細については、「実行時の Office ドキュメントへのコントロールの追加」を参照してください。
Windows フォーム コントロールまたはホスト コントロールを追加できます。ホスト コントロールは、Visual Studio Tools for Office Runtime に用意されているコントロールであり、Word や Excel のプライマリ相互運用機能アセンブリの対応するコントロールをラップします。ホスト コントロールでは、下位のネイティブ Office オブジェクトのすべての動作が利用できますが、イベントを発生させ、Windows フォームのデータ バインド モデルを使用してデータにバインドすることもできます。詳細については、「ホスト項目とホスト コントロールの概要」を参照してください。
[!メモ]
ワークシートに XmlMappedRange 管理、またはドキュメントにアドインを使用して XMLNode または XMLNodes のコントロールを追加することはできません。これらのホスト コントロールをプログラムで追加することはできません。詳細については、「ホスト項目およびホスト コントロールのプログラム上の制限事項」を参照してください。
コントロールの永続化と削除
マネージ コントロールを文書またはワークシートに追加する場合、文書を保存して閉じるとコントロールは永続化されません。すべてのホスト コントロールは、その天然職場のオブジェクトのみ置き去りになるように削除されます。たとえば、Microsoft.Office.Tools.Excel.ListObject は Microsoft.Office.Interop.Excel.ListObjectになります。Windows フォーム コントロールもすべて削除されますが、コントロールの ActiveX ラッパーはドキュメント内に残ります。コントロールをクリーン アップする場合や、次にドキュメントを開いたときにコントロールを再度作成するには、アドインにコードを追加する必要があります。詳細については、「Office ドキュメントでのダイナミック コントロールの永続化」を参照してください。
文書とブックに対するアプリケーション レベル イベントへのアクセス
ネイティブな Word および Excel オブジェクト モデルにおける一部の文書、ブック、ワークシートのイベントは、アプリケーション レベルでのみ発生します。たとえば、Word で文書を開くと DocumentBeforeSave イベントが発生しますが、このイベントは Microsoft.Office.Interop.Word.Document クラスではなく、Microsoft.Office.Interop.Word.Application クラスで定義されています。
アドインでネイティブ Office オブジェクトだけを使用する場合、これらのアプリケーション レベルのイベントを処理し、イベントが発生した文書がカスタマイズした文書かどうかを判断するための追加のコードを記述する必要があります。ホスト項目では、個別のドキュメントのイベントが扱いやすくなるように、これらのイベントがドキュメント レベルで発生します。ホスト項目を生成し、そのホスト項目のイベントを処理できます。
ネイティブな Word オブジェクトの使用例
Word 文書のアプリケーション レベルのイベントを処理する方法を次のコード例に示します。CreateDocument メソッドは、新しい文書を作成し、この文書が保存されるのを防ぐイベント ハンドラー DocumentBeforeSave を定義します。これは、Microsoft.Office.Interop.Word.Application オブジェクトに対して発生するアプリケーション レベルのイベントであるため、イベント ハンドラーは Doc パラメーターを document1 オブジェクトと比較して、document1 が保存される文書を表しているかどうかを判断する必要があります。
Private document1 As Word.Document = Nothing
Private Sub CreateDocument1()
document1 = Me.Application.Documents.Add()
End Sub
Private Sub Application_DocumentBeforeSave(ByVal Doc As Word.Document, _
ByRef SaveAsUI As Boolean, ByRef Cancel As Boolean) _
Handles Application.DocumentBeforeSave
If Type.ReferenceEquals(Doc, document1) Then
Cancel = True
End If
End Sub
private Word.Document document1 = null;
private void CreateDocument1()
{
document1 = this.Application.Documents.Add(ref missing,
ref missing, ref missing, ref missing);
this.Application.DocumentBeforeSave +=
new Word.ApplicationEvents4_DocumentBeforeSaveEventHandler(
Application_DocumentBeforeSave);
}
private void Application_DocumentBeforeSave(Word.Document Doc,
ref bool SaveAsUI, ref bool Cancel)
{
if (Type.ReferenceEquals(Doc, document1))
{
Cancel = true;
}
}
ホスト項目の使用例
次のコード例では、ホスト項目 Microsoft.Office.Tools.Word.Document の BeforeSave イベントを処理することで、このプロセスが簡略化されます。この例の CreateDocument2 メソッドは、document2 オブジェクトを拡張する Microsoft.Office.Tools.Word.Document を生成し、文書が保存されるのを防ぐイベント ハンドラー BeforeSave を定義します。このイベント ハンドラーは、document2 が保存されたときだけ呼び出されるため、保存された文書を確認するという追加の処理を行わずに、保存動作を取り消すことができます。
次のコード例がこのタスクを示します。
Private document2 As Word.Document = Nothing
Private WithEvents vstoDocument As Microsoft.Office.Tools.Word.Document = Nothing
Private Sub CreateDocument2()
document2 = Me.Application.Documents.Add()
vstoDocument = Globals.Factory.GetVstoObject(document2)
End Sub
Private Sub vstoDocument_BeforeSave(ByVal sender As Object, _
ByVal e As SaveEventArgs) Handles vstoDocument.BeforeSave
e.Cancel = True
End Sub
private Word.Document document2 = null;
private Microsoft.Office.Tools.Word.Document vstoDocument = null;
private void CreateDocument2()
{
document2 = this.Application.Documents.Add(ref missing,
ref missing, ref missing, ref missing);
vstoDocument = Globals.Factory.GetVstoObject(document2);
vstoDocument.BeforeSave += new SaveEventHandler(vstoDocument_BeforeSave);
}
private void vstoDocument_BeforeSave(object sender, SaveEventArgs e)
{
e.Cancel = true;
}
Office オブジェクトが拡張されているかどうかを判断する
あるネイティブ Office オブジェクトに対して既に拡張オブジェクトが生成されているかどうかを判断するには、HasVstoObject メソッドを使用します。このメソッドは、拡張オブジェクトが既に生成されている場合は true を返し、そうでない場合は false を返します。
Globals.Factory.HasVstoMethod メソッドを使用します。選択した拡張オブジェクトにテストする Microsoft.Office.Interop.Excel.Worksheet、または Microsoft.Office.Interop.Word.Document など、天然 Word または Excel のオブジェクトのパス。
HasVstoObject メソッドは、指定した Office オブジェクトが拡張オブジェクトを持つときにのみコードを実行する場合に役立ちます。たとえば、DocumentBeforeSave イベントを処理して、文書が保存される前にマネージ コントロールを文書から削除する Word アドインがある場合、HasVstoObject メソッドを使用して、文書が拡張されているかどうかを判断できます。文書が拡張されていない場合は、マネージ コントロールが含まれていないため、イベント ハンドラーは文書上のコントロールをクリーンアップせずに戻るだけで済みます。