ドキュメント レベルのカスタマイズにおけるネイティブな Office オブジェクトからの拡張オブジェクトの取得
Office イベントのイベント ハンドラーの多くは、イベントを発生させたブック、ワークシート、または文書を表すネイティブな Office オブジェクトを受け取ります。 場合によっては、ドキュメント レベルのカスタマイズでブックや文書がイベントを発生させたときにのみ、コードを実行することができます。 たとえば、Excel のドキュメント レベルのカスタマイズで、ユーザーがカスタマイズされたブック内のいずれかのワークシートをアクティブにしたときにはコードを実行し、同時に開いている他のブック内のワークシートをアクティブにしたときにはコードを実行しないようにすることができます。
ネイティブな Office オブジェクトがある場合、そのオブジェクトがドキュメント レベルのカスタマイズでホスト項目またはホスト コントロールに拡張されているかどうかをテストできます。 ホスト項目とホスト コントロールは、Visual Studio Tools for Office Runtime に用意された型で、Word または Excel のオブジェクト モデルにネイティブに存在するオブジェクト (ネイティブな Office オブジェクトと呼ばれます) に対して機能を追加します。 ホスト項目とホスト コントロールは、まとめて拡張オブジェクトとも呼ばれます。ホスト項目とホスト コントロールの詳細については、「ホスト項目とホスト コントロールの概要」を参照してください。
対象: このトピックの情報は、Excel 2007 と Excel 2010、および Word 2007 と Word 2010 のドキュメント レベルのプロジェクトに適用されます。詳細については、「Office アプリケーションおよびプロジェクト タイプ別の使用可能な機能」を参照してください。
GetVstoObject メソッドと HasVstoObject メソッドについて
ネイティブ Office オブジェクトをテストするには、プロジェクトで HasVstoObject メソッドおよび GetVstoObject メソッドを使用します。
ネイティブな Office オブジェクトがカスタマイズに拡張オブジェクトを保有しているかどうかを確認する場合には、HasVstoObject メソッドを使用します。 このメソッドは、ネイティブな Office オブジェクトに拡張オブジェクトがある場合は true を返し、それ以外の場合は false を返します。
ネイティブな Office オブジェクトの拡張オブジェクトを取得する場合は、GetVstoObject メソッドを使用します。 このメソッドは、指定したネイティブな Office オブジェクトに拡張オブジェクトがある場合は Microsoft.Office.Tools.Excel.ListObject、Microsoft.Office.Tools.Excel.Workbook、Microsoft.Office.Tools.Excel.Worksheet、Microsoft.Office.Tools.Word.Document のいずれかのオブジェクトを返します。 それ以外の場合、GetVstoObject は null を返します。 たとえば、指定した Microsoft.Office.Interop.Word.Document が Word 文書プロジェクトの文書の基になるオブジェクトである場合、GetVstoObject メソッドは Microsoft.Office.Tools.Word.Document を返します。
ドキュメント レベルのプロジェクトでは、GetVstoObject メソッドを使用して実行時に新しいホスト項目 (Microsoft.Office.Tools.Excel.Workbook、Microsoft.Office.Tools.Excel.Worksheet、または Microsoft.Office.Tools.Word.Document) を作成することはできません。 このメソッドを使用できるのは、デザイン時にプロジェクトで生成した既存のホスト項目にアクセスするときだけです。 実行時に新しいホスト項目を作成するには、アプリケーション レベルのプロジェクトを開発する必要があります。 詳細については、「ホスト項目およびホスト コントロールのプログラム上の制限事項」および「アプリケーション レベルのアドインにおける実行時の Word 文書や Excel ブックの拡張」を参照してください。
GetVstoObject メソッドと HasVstoObject メソッドの使用
HasVstoObject メソッドおよび GetVstoObject メソッドを呼び出す方法は、プロジェクトで対象とする .NET Framework のバージョンによって異なります。
.NET Framework 4 を対象とするプロジェクトの場合は、Globals.Factory.GetVstoObject メソッドまたは Globals.Factory.HasVstoObject メソッドを使用し、テストするネイティブ Word オブジェクトまたは Excel オブジェクト (Microsoft.Office.Interop.Word.Document、Microsoft.Office.Interop.Excel.Worksheet など) を渡します。
.NET Framework 3.5 を対象とするプロジェクトの場合は、Excel および Word のプライマリ相互運用機能アセンブリで次に示す型のインスタンスに対してメソッドを使用します。
注意
.NET Framework 3.5 を対象とするドキュメント レベルのプロジェクトで GetVstoObject メソッドと HasVstoObject メソッドを使用するには、コード ファイルの先頭に、Microsoft.Office.Tools.Excel.Extensions 名前空間または Microsoft.Office.Tools.Word.Extensions 名前空間に対する using ステートメント (C# の場合) または Imports ステートメント (Visual Basic の場合) を追加する必要があります。 GetVstoObject メソッドと HasVstoObject メソッドは、拡張メソッドとして実装されます。前に説明したステートメントを使用することで、これらのメソッドを呼び出すことができます。
例: ホスト項目がイベントを発生させたかどうかの確認
HasVstoObject メソッドおよび GetVstoObject メソッドのコード例を次に示します。 どちらの例も、Excel ブック プロジェクトの ThisWorkbook クラスの SheetActivate イベントを処理します。 最初の例では、Sh パラメーターと既定のホスト項目の InnerObject プロパティとの比較によって、いずれかの Microsoft.Office.Tools.Excel.Worksheet ホスト項目がアクティブにされたかどうかを確認します。
Sub ThisWorkbook_SheetActivate1(ByVal Sh As Object) Handles Me.SheetActivate
Dim vstoWorksheet As Microsoft.Office.Tools.Excel.Worksheet = Nothing
If Type.ReferenceEquals(Globals.Sheet1.InnerObject, Sh) Then
vstoWorksheet = Globals.Sheet1.Base
ElseIf Type.ReferenceEquals(Globals.Sheet2.InnerObject, Sh) Then
vstoWorksheet = Globals.Sheet2.Base
ElseIf Type.ReferenceEquals(Globals.Sheet3.InnerObject, Sh) Then
vstoWorksheet = Globals.Sheet3.Base
End If
If vstoWorksheet IsNot Nothing Then
' Do something with the VSTO worksheet here.
End If
End Sub
void ThisWorkbook_SheetActivate1(object Sh)
{
Microsoft.Office.Tools.Excel.Worksheet vstoWorksheet = null;
if (Type.ReferenceEquals(Globals.Sheet1.InnerObject, Sh))
vstoWorksheet = Globals.Sheet1.Base;
else if (Type.ReferenceEquals(Globals.Sheet2.InnerObject, Sh))
vstoWorksheet = Globals.Sheet2.Base;
else if (Type.ReferenceEquals(Globals.Sheet3.InnerObject, Sh))
vstoWorksheet = Globals.Sheet3.Base;
if (vstoWorksheet != null)
{
// Do something with the VSTO worksheet here.
}
}
2 番目の例では、Sh パラメーターの HasVstoObject メソッドおよび GetVstoObject メソッドを使用して、このプロセスを簡略化します。 この例は、.NET Framework 4 を対象とするプロジェクトでこれらのメソッドを呼び出す方法を示しています。
Private Sub ThisWorkbook_SheetActivate2(ByVal Sh As Object)
Dim vstoWorksheet As Microsoft.Office.Tools.Excel.Worksheet = Nothing
Dim interopWorksheet As Microsoft.Office.Interop.Excel.Worksheet =
CType(Sh, Microsoft.Office.Interop.Excel.Worksheet)
If interopWorksheet IsNot Nothing AndAlso
Globals.Factory.HasVstoObject(interopWorksheet) Then
vstoWorksheet = Globals.Factory.GetVstoObject(interopWorksheet)
End If
If vstoWorksheet IsNot Nothing Then
' Do something with the VSTO worksheet here.
End If
End Sub
void ThisWorkbook_SheetActivate2(object Sh)
{
Microsoft.Office.Tools.Excel.Worksheet vstoWorksheet = null;
Microsoft.Office.Interop.Excel.Worksheet interopWorksheet =
Sh as Microsoft.Office.Interop.Excel.Worksheet;
if (interopWorksheet != null && Globals.Factory.HasVstoObject(interopWorksheet))
{
vstoWorksheet = Globals.Factory.GetVstoObject(interopWorksheet);
}
if (vstoWorksheet != null)
{
// Do something with the VSTO worksheet here.
}
}
次の例は、同じ作業を .NET Framework 3.5 を対象とするプロジェクトで行う方法を示しています。
Sub ThisWorkbook_SheetActivate2(ByVal Sh As Object) Handles Me.SheetActivate
Dim vstoWorksheet As Microsoft.Office.Tools.Excel.Worksheet = Nothing
Dim interopWorksheet As Microsoft.Office.Interop.Excel.Worksheet = _
CType(Sh, Microsoft.Office.Interop.Excel.Worksheet)
If interopWorksheet IsNot Nothing AndAlso _
interopWorksheet.HasVstoObject() Then
vstoWorksheet = interopWorksheet.GetVstoObject()
End If
If vstoWorksheet IsNot Nothing Then
' Do something with the VSTO worksheet here.
End If
End Sub
void ThisWorkbook_SheetActivate2(object Sh)
{
Microsoft.Office.Tools.Excel.Worksheet vstoWorksheet = null;
Microsoft.Office.Interop.Excel.Worksheet interopWorksheet =
Sh as Microsoft.Office.Interop.Excel.Worksheet;
if (interopWorksheet != null && interopWorksheet.HasVstoObject())
{
vstoWorksheet = interopWorksheet.GetVstoObject();
}
if (vstoWorksheet != null)
{
// Do something with the VSTO worksheet here.
}
}