Office ソリューションの遅延バインディング

Microsoft Office アプリケーションのオブジェクト モデルの一部の型では、遅延バインディング機能を通じて使用できる機能が提供されます。 たとえば、一部のメソッドとプロパティでは、Office アプリケーションのコンテキストに応じて異なる型のオブジェクトが返されることがあり、型によっては、コンテキストによって異なるメソッドやプロパティを公開できます。

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

Option Strict がオフになっている Visual Basic プロジェクトと、.NET Framework 4 または .NET Framework 4.5 を対象とした Visual C# プロジェクトでは、これらの遅延バインディング機能を使用する型を直接操作することができます。

オブジェクトの戻り値の暗黙的および明示的なキャスト

Microsoft Office プライマリ相互運用機能アセンブリ (PIA) の多くのメソッドとプロパティでは、複数の異なる型のオブジェクトを返すことができるため、Object 値が返されます。 たとえば、ActiveSheet プロパティは Object を返します。これは、どのシートがアクティブかによって、戻り値が Worksheet または Chart オブジェクトになる可能性があるためです。

メソッドまたはプロパティが Object を返す場合は、(Visual Basic で) オブジェクトを明示的に変換して、Option Strict がオンになっている Visual Basic プロジェクトでの適切な型にする必要があります。 Option Strict がオフになっている Visual Basic プロジェクトでは、Object 戻り値を明示的にキャストする必要はありません。

ほとんどの場合、Object を返すメンバーの戻り値の型は、参照ドキュメントに一覧表示されています。 オブジェクトを変換またはキャストすると、コード エディターでオブジェクトの IntelliSense が有効になります。

Visual Basic での変換について詳しくは、「暗黙の型変換と明示的な型変換 (Visual Basic)」および「CType 関数 (Visual Basic)」をご覧ください。

次のコード例は、Option Strict がオンになっている Visual Basic プロジェクトで、オブジェクトを特定の型にキャストする方法を示したものです。 このタイプのプロジェクトでは、Cells プロパティを明示的に Range にキャストする必要があります。 この例では、Sheet1 というワークシート クラスを含んだ、ドキュメント レベルのプロジェクトが必要です。

Dim castRange As Excel.Range = CType(Globals.Sheet1.Cells(1, 1), Excel.Range)

次のコード例は、Option Strict がオフになっている Visual Basic か、.NET Framework 4 を対象とした Visual C# プロジェクトで、オブジェクトを特定の型に暗黙的にキャストする方法を示したものです。 これらのタイプのプロジェクトでは、Cells プロパティは暗黙的に Range にキャストされます。 この例では、Sheet1 というワークシート クラスを含んだ、ドキュメント レベルのプロジェクトが必要です。

Excel.Range dynamicRange = Globals.Sheet1.Cells[1, 1];

遅延バインディングを通じてのみ使用できるメンバーにアクセスする

Office PIA の一部のプロパティとメソッドは、遅延バインディングを通じてのみ使用できます。 Option Strict がオフになっているか Visual Basic プロジェクトや、.NET Framework 4 または .NET Framework 4.5 を対象とした Visual C# プロジェクトでは、それらの言語の遅延バインディング機能を使って、遅延バインドされたメンバーにアクセスできます。 Option Strict がオンになっている Visual Basic プロジェクトでは、これらのメンバーにアクセスするために、リフレクションを使用する必要があります。

次のコード例は、Option Strict がオフになっている Visual Basic か、.NET Framework 4 を対象とした Visual C# プロジェクトで、遅延バインドされたメンバーにアクセスする方法を示したものです。 この例では、Word の [ファイルを開く] ダイアログ ボックスの、遅延バインドされた Name プロパティにアクセスします。 この例を使用するには、Word プロジェクトの ThisDocument クラスまたは ThisAddIn クラスからコードを実行します。

dynamic dialog = Application.Dialogs[Word.WdWordDialog.wdDialogFileOpen];
dialog.Name = "Testing";
dialog.Show();
MessageBox.Show(dialog.Name);

次のコード例は、Option Strict がオンになっている Visual Basic プロジェクトで、リフレクションを使って同じタスクを実行する方法を示したものです。

Dim dlg As Word.Dialog = Application.Dialogs(Word.WdWordDialog.wdDialogFileOpen)
Dim dlgType As Type = GetType(Word.Dialog)

' Set the Name property of the dialog box.
dlgType.InvokeMember("Name", _
    Reflection.BindingFlags.SetProperty Or _
        Reflection.BindingFlags.Public Or _
        Reflection.BindingFlags.Instance, _
    Nothing, dlg, New Object() {"Testing"}, _
    System.Globalization.CultureInfo.InvariantCulture)

' Display the dialog box.
dlg.Show()

' Show the Name property.
MessageBox.Show(dlgType.InvokeMember("Name", _
    Reflection.BindingFlags.GetProperty Or _
        Reflection.BindingFlags.Public Or _
        Reflection.BindingFlags.Instance, _
    Nothing, dlg, Nothing, _
    System.Globalization.CultureInfo.InvariantCulture))