Demonstra Passo a passo: Adicionar controles a uma planilha em tempo de execução em um projeto de nível de aplicativo

Você pode adicionar controles para qualquer planilha aberta usando um suplemento do Excel. Este passo a passo demonstra como usar a faixa de opções para permitir que os usuários adicionem um Button, um NamedRangee um ListObject a uma planilha. For information, see Adicionar controles a documentos do Office em tempo de execução.

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

This walkthrough illustrates the following tasks:

  • Fornecendo uma interface de usuário (UI) para adicionar controles para a planilha.

  • Adicionando controles para a planilha.

  • Removendo os controles da planilha.

ObservaçãoObservação

Seu computador pode mostrar nomes ou locais diferentes para alguns dos elementos da interface do usuário do Visual Studio nas instruções a seguir. A edição do Visual Studio que você possui e as configurações que você usa determinam esses elementos. Para obter mais informações, consulte Configurações do Visual Studio.

Pré-requisitos

You need the following components to complete this walkthrough:

-

Uma edição do Visual Studio 2010 que inclua as ferramentas de desenvolvedor do Microsoft Office. Para obter mais informações, consulte [Configurando um computador para desenvolver soluções do Office](bb398242\(v=vs.100\).md).
  • Microsoft Office Excel 2007 ou Excel 2010.

Criar um novo Excel Add-in do projeto

Comece criando um projeto de suplemento do Excel.

Para criar um novo Excel add-in do projeto

  1. Em Visual Studio, criar um suplemento do projeto do Excel com o nome ExcelDynamicControls.

  2. No Novo projeto caixa de diálogo, selecione Create directory for solution.

  3. Salve o projeto para qualquer local.

    For more information, see Como: Criar projetos do Office em Visual Studio.

Fornecendo uma interface de usuário para adicionar controles a uma planilha

Adicione uma guia personalizada à Faixa de opções do Excel. Os usuários podem selecionar as caixas de seleção na guia para adicionar controles a uma planilha.

Para fornecer uma interface de usuário para adicionar controles a uma planilha

  1. On the Project menu, click Add New Item.

  2. No Add New Item caixa de diálogo, selecione **a faixa de opções (Visual Designer)**e em seguida, clique em Add.

    Um arquivo chamado Ribbon1. cs ou Ribbon1. vb abre no Designer de faixa de opções e exibe uma guia padrão e o grupo.

  3. Do Controles de faixa de opções do Office guia da Toolbox, arraste um controle CheckBox para Grupo1.

  4. Clique em CheckBox1 para selecioná-lo.

  5. No Propriedades janela, altere as propriedades a seguir.

    Property

    Value

    Name

    Button

    Label

    Button

  6. Adicionar uma segunda caixa de seleção para Grupo1e altere as propriedades a seguir.

    Property

    Value

    Name

    NamedRange

    Label

    NamedRange

  7. Adicionar uma terceira caixa de seleção para Grupo1e altere as propriedades a seguir.

    Property

    Value

    Name

    ListObject

    Label

    ListObject

Adicionando controles para a planilha.

Controles gerenciados só podem ser adicionados aos itens de host, que atuam como recipientes. Porque o suplemento projetos trabalham com qualquer pasta de trabalho, o suplemento converte a planilha em um item de host ou obtém um item de host existente, antes de adicionar o controle. Adicione código para os manipuladores de evento de clique de cada controle para gerar um Worksheet o item de host que se baseia na planilha aberta. Em seguida, adicione um Button, um NamedRangee um ListObject na seleção atual na planilha.

Para adicionar controles a uma planilha

  1. No Designer de faixa de opções, clique duas vezes em botão.

    O Click o manipulador de eventos da botão caixa de seleção abre no Editor de código.

  2. Substituir o Button_Click o manipulador de eventos com o código a seguir.

    Esse código usa a GetVstoObject método para obter um item de host que representa a primeira planilha na pasta de trabalho e, em seguida, adiciona um Button o controle para a célula selecionada no momento.

    Private Sub Button_Click(ByVal sender As System.Object, _
        ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) _
            Handles Button.Click
    
        Dim NativeWorksheet As Microsoft.Office.Interop.Excel.Worksheet =
            Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets(1)
    
        ' Use the following line of code in projects that target the .NET Framework 4.
        Dim worksheet As Microsoft.Office.Tools.Excel.Worksheet =
            Globals.Factory.GetVstoObject(NativeWorksheet)
    
        ' In projects that target the .NET Framework 3.5, use the following line of code.
        ' Dim worksheet = CType(Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets(1),  _
        '    Excel.Worksheet).GetVstoObject()
    
        Dim buttonName As String = "MyButton"
    
        If CType(sender, RibbonCheckBox).Checked Then
            Dim selection As Excel.Range = Globals.ThisAddIn.Application.Selection
            If Not (selection Is Nothing) Then
                Dim button As New Microsoft.Office.Tools.Excel.Controls.Button()
                worksheet.Controls.AddControl(button, selection, buttonName)
            End If
        Else
            worksheet.Controls.Remove(buttonName)
        End If
    End Sub
    
    private void Button_Click(object sender, RibbonControlEventArgs e)
    {
        // Use the following line of code in projects that target the .NET Framework 4.
        Worksheet worksheet = Globals.Factory.GetVstoObject(
            Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[1]);
    
        // In projects that target the .NET Framework 3.5, use the following line of code.
        // Worksheet worksheet = 
        //     ((Excel.Worksheet)Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[1]).GetVstoObject();
    
        string buttonName = "MyButton";
    
        if (((RibbonCheckBox)sender).Checked)
        {
            Excel.Range selection = Globals.ThisAddIn.Application.Selection as Excel.Range;
            if (selection != null)
            {
                Microsoft.Office.Tools.Excel.Controls.Button button =
                    new Microsoft.Office.Tools.Excel.Controls.Button();
                worksheet.Controls.AddControl(button, selection, buttonName);
            }
        }
        else
        {
            worksheet.Controls.Remove(buttonName);
        }
    }
    
  3. Em Solution Explorer, selecione Ribbon1. cs ou Ribbon1. vb.

  4. Sobre o Exibir menu, clique em Designer.

  5. No Designer de faixa de opções, clique duas vezes em NamedRange.

  6. Substituir o NamedRange_Click o manipulador de eventos com o código a seguir.

    Esse código usa a GetVstoObject método para obter um item de host que representa a primeira planilha na pasta de trabalho e, em seguida, define uma NamedRange o controle para a célula selecionada no momento ou células.

    Private Sub NamedRange_Click(ByVal sender As System.Object, _
        ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) _
            Handles NamedRange.Click
    
        Dim NativeWorksheet As Microsoft.Office.Interop.Excel.Worksheet =
            Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets(1)
    
        ' Use the following line of code in projects that target the .NET Framework 4.
        Dim worksheet As Microsoft.Office.Tools.Excel.Worksheet =
            Globals.Factory.GetVstoObject(NativeWorksheet)
    
        ' In projects that target the .NET Framework 3.5, use the following line of code.
        ' Dim worksheet = CType(Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets(1),  _
        '    Excel.Worksheet).GetVstoObject()
    
        Dim rangeName As String = "MyNamedRange"
    
        If CType(sender, RibbonCheckBox).Checked Then
            Dim selection As Excel.Range = Globals.ThisAddIn.Application.Selection
            If Not (selection Is Nothing) Then
                Dim namedRange As NamedRange = _
                    worksheet.Controls.AddNamedRange(selection, rangeName)
            End If
        Else
            worksheet.Controls.Remove(rangeName)
        End If
    End Sub
    
    private void NamedRange_Click(object sender, RibbonControlEventArgs e)
    {
        // Use the following line of code in projects that target the .NET Framework 4.
        Worksheet worksheet = Globals.Factory.GetVstoObject(
            Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[1]);
    
        // In projects that target the .NET Framework 3.5, use the following line of code.
        // Worksheet worksheet = 
        //     ((Excel.Worksheet)Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[1]).GetVstoObject();
    
        string Name = "MyNamedRange";
    
        if (((RibbonCheckBox)sender).Checked)
        {
            Excel.Range selection = Globals.ThisAddIn.Application.Selection as Excel.Range;
            if (selection != null)
            {
                worksheet.Controls.AddNamedRange(selection, Name);
            }
        }
        else
        {
            worksheet.Controls.Remove(Name);
        }
    }
    
  7. No Designer de faixa de opções, clique duas vezes em ListObject.

  8. Substituir o ListObject_Click o manipulador de eventos com o código a seguir.

    Esse código usa a GetVstoObject método para obter um item de host que representa a primeira planilha na pasta de trabalho e, em seguida, define uma ListObject para a célula selecionada no momento ou células.

    Private Sub ListObject_Click(ByVal sender As System.Object, _
        ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) _
            Handles ListObject.Click
    
        Dim NativeWorksheet As Microsoft.Office.Interop.Excel.Worksheet =
            Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets(1)
    
        ' Use the following line of code in projects that target the .NET Framework 4.
        Dim worksheet As Microsoft.Office.Tools.Excel.Worksheet =
            Globals.Factory.GetVstoObject(NativeWorksheet)
    
        ' In projects that target the .NET Framework 3.5, use the following line of code.
        ' Dim worksheet = CType(Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets(1),  _
        '    Excel.Worksheet).GetVstoObject()
    
        Dim listObjectName As String = "MyListObject"
    
        If CType(sender, RibbonCheckBox).Checked Then
            Dim selection As Excel.Range = _
                Globals.ThisAddIn.Application.Selection
            If Not (selection Is Nothing) Then
                worksheet.Controls.AddListObject(selection, listObjectName)
            End If
        Else
            worksheet.Controls.Remove(listObjectName)
        End If
    End Sub
    
    private void ListObject_Click(object sender, RibbonControlEventArgs e)
    {
        // Use the following line of code in projects that target the .NET Framework 4.
        Worksheet worksheet = Globals.Factory.GetVstoObject(
            Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[1]);
    
        // In projects that target the .NET Framework 3.5, use the following line of code.
        // Worksheet worksheet = 
        //     ((Excel.Worksheet)Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[1]).GetVstoObject();
    
        string listObjectName = "MyListObject";
    
        if (((RibbonCheckBox)sender).Checked)
        {
            Excel.Range selection = Globals.ThisAddIn.Application.Selection as Excel.Range;
            if (selection != null)
            {
                worksheet.Controls.AddListObject(selection, listObjectName);
            }
        }
        else
        {
            worksheet.Controls.Remove(listObjectName);
        }
    }
    
  9. Adicione as seguintes instruções para a parte superior do arquivo de código da faixa de opções.

    Imports Excel = Microsoft.Office.Interop.Excel
    Imports Microsoft.Office.Tools.Excel
    Imports Microsoft.Office.Tools.Excel.Extensions
    
    using Excel = Microsoft.Office.Interop.Excel;
    using Microsoft.Office.Tools.Excel;
    using Microsoft.Office.Tools.Excel.Extensions;
    

Removendo os controles da planilha

Controles não são persistentes quando a planilha é salvo e fechada. Programaticamente, você deve remover todos os controles do Windows Forms gerados antes da planilha é salva ou uma estrutura de tópicos do controle aparecerá quando a pasta de trabalho é aberta novamente. Adicione código para o WorkbookBeforeSave evento que remove os controles do Windows Forms da coleção controls do item de host gerado. For more information, see Persistência de controles dinâmicos em documentos do Office.

Para remover os controles da planilha

  1. Em Solution Explorer, selecione ThisAddIn.cs ou ThisAddIn. vb.

  2. Sobre o Exibir menu, clique em código.

  3. Adicione o seguinte método à classe ThisAddIn. Esse código obtém a primeira planilha na pasta de trabalho e, em seguida, usa o HasVstoObject método para verificar se a planilha tem um objeto de planilha gerada. Se o objeto de planilha gerado tem controles, o código obtém esse objeto de planilha e itera através da coleção de controle, removendo os controles.

    Sub Application_WorkbookBeforeSave _
        (ByVal workbook As Microsoft.Office.Interop.Excel.Workbook, _
         ByVal SaveAsUI As Boolean, ByRef Cancel As Boolean) _
         Handles Application.WorkbookBeforeSave
    
        Dim worksheet As Excel.Worksheet = workbook.Worksheets(1)
    
        ' Use the following code in projects that target the .NET Framework 4.
        If Globals.Factory.HasVstoObject(worksheet) And
            Globals.Factory.GetVstoObject(worksheet).Controls.Count > 0 Then
            Dim vstoWorksheet As Worksheet = Globals.Factory.GetVstoObject(worksheet)
    
            ' In projects that target the .NET Framework 3.5, use the following code.
            ' If worksheet.HasVstoObject() And worksheet.GetVstoObject().Controls.Count > 0 Then
            ' Dim vstoWorksheet As Worksheet = worksheet.GetVstoObject()
    
            While vstoWorksheet.Controls.Count > 0
                Dim vstoControl As Object = vstoWorksheet.Controls(0)
                vstoWorksheet.Controls.Remove(vstoControl)
            End While
        End If
    End Sub
    
    void Application_WorkbookBeforeSave(Microsoft.Office.Interop.Excel.Workbook workbook, 
        bool SaveAsUI, ref bool Cancel)
    {
        Excel.Worksheet worksheet =
            workbook.Worksheets[1] as Excel.Worksheet;
    
        // Use the following lines of code in projects that target the .NET Framework 4.
        if (Globals.Factory.HasVstoObject(worksheet) && 
            Globals.Factory.GetVstoObject(worksheet).Controls.Count > 0)
        {
            Worksheet vstoWorksheet = Globals.Factory.GetVstoObject(worksheet);
    
        // In projects that target the .NET Framework 3.5, use the following line of code.
        // if (worksheet.HasVstoObject() && worksheet.GetVstoObject().Controls.Count > 0)
        // {
        //     Worksheet vstoWorksheet = worksheet.GetVstoObject();               
    
            while (vstoWorksheet.Controls.Count > 0)
            {
                object vstoControl = vstoWorksheet.Controls[0];
                vstoWorksheet.Controls.Remove(vstoControl);
            }
    
        }
    }
    
  4. No C#, você deve criar um manipulador de eventos para o WorkbookBeforeSave de evento. Você pode colocar esse código de ThisAddIn_Startup método. For more information about creating event handlers, see Como: Criar manipuladores de eventos em projetos do Office. Substituir o ThisAddIn_Startup método com o código a seguir.

    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        this.Application.WorkbookBeforeSave += 
            new Microsoft.Office.Interop.Excel.AppEvents_WorkbookBeforeSaveEventHandler
                (Application_WorkbookBeforeSave);
    }
    

Teste da solução

Adicione controles a uma planilha selecionando-os em uma guia personalizada da faixa de opções. Quando você salvar a planilha, esses controles são removidos.

Para testar a solução.

  1. Pressione F5 para executar seu projeto.

  2. Selecione qualquer célula em Sheet1.

  3. Clique o Add-Ins guia.

  4. No Grupo1 de grupo, clique em botão.

    Um botão aparece na célula selecionada.

  5. Selecione uma célula diferente na Sheet1.

  6. No Grupo1 de grupo, clique em NamedRange.

    Um intervalo nomeado é definido para a célula selecionada.

  7. Selecione uma série de células em Sheet1.

  8. No Grupo1 de grupo, clique em ListObject.

    Um objeto de lista é adicionado para as células selecionadas.

  9. Salve a planilha.

    Os controles que você adicionou à Plan1 não aparecem.

Próximas etapas

Você pode aprender mais sobre os controles no Excel add-in de projetos a partir deste tópico:

Consulte também

Conceitos

Usando os controles do Windows Forms em planilhas do Excel

Controle de NamedRange

Controle de ListObject

Outros recursos

Soluções do Excel

Controles em documentos do Office