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:
Utilice el método HasVstoObject si desea determinar si el objeto de Office nativo tiene un objeto extendido en la personalización. Este método devuelve true si el objeto de Office nativo tiene un objeto extendido, y false si no lo tiene.
Utilice el método GetVstoObject si desea obtener el objeto extendido para un objeto de Office nativo. Este método devuelve un objeto Microsoft.Office.Tools.Excel.ListObject, Microsoft.Office.Tools.Excel.Workbook, Microsoft.Office.Tools.Excel.Worksheet o Microsoft.Office.Tools.Word.Document si el objeto de Office nativo especificado tiene uno. De lo contrario, GetVstoObject devuelve null. Por ejemplo, el método GetVstoObject devuelve un documento Microsoft.Office.Tools.Word.Document si el documento Microsoft.Office.Interop.Word.Document especificado es el objeto subyacente del documento en el proyecto de documento de Word.
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:
En proyectos destinados a .NET Framework 4, utilice el método Globals.Factory.GetVstoObject o Globals.Factory.HasVstoObject y pase el objeto de Word o Excel nativo (como Microsoft.Office.Interop.Word.Document o Microsoft.Office.Interop.Excel.Worksheet) que desea probar.
En proyectos destinados a .NET Framework 3.5, obtenga acceso a los métodos de una instancia de uno de los tipos siguientes en los ensamblados de interoperabilidad primarios de Excel y Word:
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
Métodos de extensión (Visual Basic)