Obtener objetos extendidos a partir de objetos nativos de Office en personalizaciones en el nivel del documento

Muchos controladores de eventos de Office reciben un objeto de Office nativo que representa el libro, la hoja de cálculo o el documento que provocó el evento. En algunos casos, le puede interesar ejecutar cierto código solo si el libro o el documento de su personalización en el nivel del documento provocó el evento. Por ejemplo, en una personalización de nivel de documento para Excel, le podría interesar ejecutar código cuando el usuario activa una de las hoja de cálculo en la libro personalizado, pero no cuando el usuario activa una hoja de cálculo en algún otro libro que está abierto al mismo tiempo.

Si tiene un objeto de Office nativo, puede probar si ese objeto se ha extendido en un elemento host o un control host en una personalización de nivel de documento. Los elementos host y controles host son tipos que proporciona Motor en tiempo de ejecución de Microsoft Visual Studio Tools para Office para agregar funcionalidad a los objetos que existen de forma nativa en los modelos de objetos de Excel o Word (denominados objetos de Office nativos). Colectivamente, los elementos host y los controles host también se denominan objetos extendidos. Para obtener más información sobre los elementos host y los controles host, vea Información general sobre elementos y controles Host.

Se aplica a: la información de este tema se aplica a los proyectos de nivel de documento para las siguientes aplicaciones: Excel 2007 y Excel 2010; Word 2007 y Word 2010. Para obtener más información, vea Características disponibles por aplicación y tipo de proyecto de Office.

Descripción de los métodos GetVstoObject y HasVstoObject

Para probar un objeto de Office nativo, utilice los métodos GetVstoObject y HasVstoObject en el proyecto:

En los proyectos de nivel de documento no se puede usar el método GetVstoObject para crear un nuevo elemento host Microsoft.Office.Tools.Excel.Workbook, Microsoft.Office.Tools.Excel.Worksheet o Microsoft.Office.Tools.Word.Document en tiempo de ejecución. Solo puede usar este método para tener acceso a elementos host existentes generados en el proyecto en tiempo de diseño. Si desea crear nuevos elementos host en tiempo de ejecución, debe desarrollar un proyecto de nivel de aplicación. Para obtener más información, vea Limitaciones de programación de elementos y controles Host y Ampliar documentos de Word y libros de Excel en complementos en el nivel de la aplicación en tiempo de ejecución.

Utilizar los métodos HasVstoObject y GetVstoObject

La manera en que llama a los métodos HasVstoObject y GetVstoObject depende de a qué versión de .NET Framework está destinado el proyecto:

Nota

Para usar los métodos GetVstoObject y HasVstoObject en proyectos de nivel de documento destinados a .NET Framework 3.5, se deben agregar instrucciones using (para C#) o Imports (para Visual Basic) para los espacios de nombres Microsoft.Office.Tools.Excel.Extensions o Microsoft.Office.Tools.Word.Extensions al principio del archivo de código. Los métodos GetVstoObject y HasVstoObject se implementan como métodos de extensión, y estas instrucciones permiten llamar a estos métodos.

Ejemplo: determinar si un elemento host generó un evento

En el siguiente ejemplo de código se muestran los métodos HasVstoObject y GetVstoObject. Ambos ejemplos controlan el evento SheetActivate de la clase ThisWorkbook en un proyecto de libro de Excel. El primer ejemplo determina si uno de los elementos host Microsoft.Office.Tools.Excel.Worksheet se activó comparando el parámetro Sh con la propiedad InnerObject de cada elemento host predeterminado.

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.
    }
}

En el ejemplo siguiente se simplifica este proceso utilizando los métodos GetVstoObject y HasVstoObject del parámetro Sh. En este ejemplo se muestra cómo llamar a estos métodos en un proyecto destinado a .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.
    }
}

En el siguiente ejemplo se muestra la misma tarea en un proyecto destinado a .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.
    }
}

Vea también

Referencia

Métodos de extensión (Guía de programación de C#)

Conceptos

Información general sobre elementos y controles Host

Ampliar documentos de Word y libros de Excel en complementos en el nivel de la aplicación en tiempo de ejecución

Métodos de extensión (Visual Basic)

Otros recursos

Programar personalizaciones de nivel de documento