Obtendo Extended objetos a partir de objetos nativos do Office no nível do documento personalizações

Vários manipuladores de eventos para eventos de Office recebem um objeto nativo do Office que representa a pasta de trabalho, planilha ou documento que disparou o evento. Em alguns casos, convém executar algum código somente se a pasta de trabalho ou o documento na sua personalização no nível do documento disparou o evento. Por exemplo, uma personalização de nível de documento do Excel, convém executar algum código quando o usuário ativar uma das planilhas na pasta de trabalho personalizada, mas não quando o usuário ativar uma planilha em outra pasta que seja aberto ao mesmo tempo.

Quando você tem um objeto nativo do Office, você pode testar se o objeto foi estendido em um o item de host ou o controle de host uma personalização de nível de documento. Itens de host e controles de host são tipos fornecidos pelo Visual Studio Tools for Office runtime que adiciona funcionalidade a objetos que existem nativamente nos modelos de objeto do Word ou Excel (chamado objetos nativos do Office). Coletivamente, itens de host e controles de host também são chamados de estendidos objetos. Para obter mais informações sobre itens de host e controles de host, consulte Itens de host e a visão geral sobre controles de Host.

Aplicável a: As informações neste tópico se aplicam a projetos de nível de documento para os seguintes aplicativos: Excel 2007 e Excel 2010; Word 2007 e Word 2010. Para obter mais informações, consulte Recursos disponíveis pelo aplicativo do Office e o tipo de projeto.

Noções básicas sobre os métodos de HasVstoObject e GetVstoObject

Para testar um objeto nativo do Office, use o HasVstoObject e GetVstoObject métodos em seu projeto:

Em projetos de nível de documento, você não pode usar o GetVstoObject método para criar uma nova Microsoft.Office.Tools.Excel.Workbook, Microsoft.Office.Tools.Excel.Worksheet, ou Microsoft.Office.Tools.Word.Document o item de host em tempo de execução. Você pode usar esse método apenas para acessar itens host existentes que são gerados em seu projeto em tempo de design. Se você desejar criar novos itens de host em tempo de execução, você deve desenvolver um projeto de nível de aplicativo. For more information, see Limitações de programação de itens de Host e controles de Host and Estendendo os documentos do Word e pastas de trabalho do Excel em suplementos de nível de aplicativo em tempo de execução.

Usando os métodos de HasVstoObject e o GetVstoObject

A maneira que você chamar o HasVstoObject e GetVstoObject métodos depende de qual versão do.NET Framework seus destinos do projeto:

ObservaçãoObservação

Para usar o GetVstoObject e projetos de métodos deHasVstoObject no nível do documento de destino do.NET Framework 3.5, você deve adicionar using (para C#) ou Imports (para Visual Basic) instruções para a Microsoft.Office.Tools.Excel.Extensions ou Microsoft.Office.Tools.Word.Extensions namespaces na parte superior do seu arquivo de código. O GetVstoObject e HasVstoObject métodos são implementados como métodos de extensão, e essas instruções permitem que você chamar esses métodos.

Exemplo: Determinar se um Item de Host disparou um evento

Os exemplos de código a seguir demonstram o HasVstoObject e GetVstoObject métodos. Ambos os exemplos de manipular a SheetActivate evento da ThisWorkbook classe em um projeto de pasta de trabalho do Excel. O primeiro exemplo determina se um do Microsoft.Office.Tools.Excel.Worksheet itens do host foi ativado, comparando o Sh parâmetro com o InnerObject propriedade de cada item de host padrão.

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

O próximo exemplo simplifica esse processo usando o HasVstoObject e GetVstoObject métodos para a Sh parâmetro. Este exemplo demonstra como chamar esses métodos em um projeto voltado para o .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.
    }
}

O exemplo a seguir demonstra a mesma tarefa em um projeto que tem como alvo o.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.
    }
}

Consulte também

Referência

Métodos de extensão (guia de programação de C#)

Conceitos

Itens de host e a visão geral sobre controles de Host

Estendendo os documentos do Word e pastas de trabalho do Excel em suplementos de nível de aplicativo em tempo de execução

Métodos de extensão (Visual Basic)

Outros recursos

Programação personalizações em nível de documento