Compartilhar via


Passo a passo: chamar código do VBA em um projeto do Visual C#

Este passo a passo demonstra como chamar um método em uma customização no nível do documento do Microsoft Office Excel a partir do código do Visual Basic for Applications (VBA) na pasta de trabalho. O procedimento envolve três etapas básicas: adicionar um método à classe de item host Sheet1, expor o método ao código VBA na pasta de trabalho e chamar o método do código VBA na pasta de trabalho.

Aplica-se a: As informações neste tópico se aplicam a projetos de nível de documento para Excel e Word. Para obter mais informações, consulte Os recursos disponíveis pelo aplicativo do Office e pelo tipo de projeto.

Embora este passo a passo use o Excel especificamente, os conceitos demonstrados pelo passo a passo também são aplicáveis a projetos de nível de documento para o Word.

Este passo a passo ilustra as seguintes tarefas:

  • Criando uma pasta de trabalho que contém código VBA.

  • Confiando no local da pasta de trabalho usando a Central de Confiabilidade no Excel.

  • Adicionando um método à classe de item de Sheet1 host.

  • Extraindo uma interface para a classe de item de Sheet1 host.

  • Expondo o método ao código VBA.

  • Chamando o método do código VBA.

Observação

Seu computador pode mostrar diferentes nomes ou locais para alguns dos elementos de 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, confira Personalizar o IDE do Visual Studio.

Pré-requisitos

Você precisará dos seguintes componentes para concluir este passo a passo:

Criar uma pasta de trabalho que contenha código VBA

A primeira etapa é criar uma pasta de trabalho habilitada para macro que contenha uma macro VBA simples. Antes de expor o código em uma personalização para o VBA, a pasta de trabalho já deve conter código VBA. Caso contrário, o Visual Studio não conseguirá modificar o projeto VBA para que o código VBA possa chamar o assembly de personalização.

Se você já tiver uma pasta de trabalho que contenha código VBA que deseja usar, ignore esta etapa.

Para criar uma pasta de trabalho que contenha código VBA

  1. Inicie o Excel.

  2. Salve o documento ativo como uma Pasta de Trabalho do Excel habilitada para macro (*.xlsm) com o nome WorkbookWithVBA. Salve-o em um local conveniente, como a área de trabalho.

  3. Na Faixa de Opções, clique na guia Desenvolvedor .

    Observação

    Se a guia Desenvolvedor não estiver visível, primeiro você deverá mostrá-la. Para obter mais informações, consulte Como mostrar a guia desenvolvedor no Ribbon.

  4. No grupo Código , clique em Visual Basic.

    O Editor do Visual Basic é aberto.

  5. Na janela Projeto , clique duas vezes em ThisWorkbook.

    O arquivo de código do ThisWorkbook objeto é aberto.

  6. Adicione o código VBA a seguir ao arquivo de código. Esse código define uma função simples que não faz nada. A única finalidade dessa função é garantir que um projeto VBA exista na pasta de trabalho. Isso é necessário para etapas posteriores neste passo a passo.

    Sub EmptySub()
    End Sub
    
  7. Salve o documento e saia do Excel.

Criar o projeto

Agora você pode criar um projeto no nível do documento para Excel que usa a pasta de trabalho habilitada para macro que você criou anteriormente.

Para criar um novo projeto

  1. Inicie o Visual Studio.

  2. No menu Arquivo , aponte para Novo e clique em Projeto.

  3. No painel de modelos, expanda Visual C# e, em seguida, expanda Office/SharePoint.

  4. Selecione o nó Suplementos do Office .

  5. Na lista de modelos de projeto, selecione a Pasta de Trabalho do Excel 2010 ou o projeto da Pasta de Trabalho do Excel 2013 .

  6. Na caixa Nome , digite CallingCodeFromVBA.

  7. Clique em OK.

    O Assistente de Projeto das Ferramentas do Visual Studio para Office é aberto.

  8. Selecione Copiar um documento existente e, no caminho completo da caixa de documento existente , especifique o local da pasta de trabalho WorkbookWithVBA que você criou anteriormente. Se você estiver usando sua própria pasta de trabalho com habilitação para macros, especifique o local dessa pasta de trabalho.

  9. Clique em Concluir.

    O Visual Studio abre a pasta de trabalho WorkbookWithVBA no designer e adiciona o projeto CallingCodeFromVBA ao Gerenciador de Soluções.

Confiar no local da pasta de trabalho

Antes de permitir que o código na sua solução interaja com o código VBA na pasta de trabalho, é necessário confiar no VBA da pasta de trabalho para ser executado. Há várias maneiras de fazer isso. Neste passo a passo, você realizará essa tarefa confiando no local da pasta de trabalho na Central de Confiabilidade no Excel.

Para confiar no local da pasta de trabalho

  1. Inicie o Excel.

  2. Clique na guia Arquivo .

  3. Clique no botão Opções do Excel .

  4. No painel categorias, clique em Central de Confiabilidade.

  5. No painel de detalhes, clique em Configurações da Central de Confiabilidade.

  6. No painel categorias, clique em Locais Confiáveis.

  7. No painel de detalhes, clique em Adicionar novo local.

  8. Na caixa de diálogo Local Confiável do Microsoft Office , navegue até a pasta que contém o projeto CallingCodeFromVBA .

  9. As subpastas selecionadas desse local também são confiáveis.

  10. Na caixa de diálogo Local Confiável do Microsoft Office , clique em OK.

  11. Na caixa de diálogo Central de Confiabilidade , clique em OK.

  12. Na caixa de diálogo Opções do Excel , clique em OK.

  13. Saia do Excel.

Adicionar um método à classe Sheet1

Agora que o projeto VBA está configurado, adicione um método público à Sheet1 classe do item host que você pode chamar do código VBA.

Para adicionar um método à classe Sheet1

  1. No Gerenciador de Soluções, clique com o botão direito do mouse em Sheet1.cs e clique em Exibir Código.

    O arquivo Sheet1.cs é aberto no Editor de Código.

  2. Adicione o seguinte código à classe Sheet1. O CreateVstoNamedRange método cria um novo NamedRange objeto no intervalo especificado. Esse método também cria um manipulador de eventos para o Selected evento do NamedRange. Mais adiante neste passo a passo, você chamará o CreateVstoNamedRange método do código VBA no documento.

    private Microsoft.Office.Tools.Excel.NamedRange namedRange1;
    
    public void CreateVstoNamedRange(Excel.Range range, string name)
    {
        if (!this.Controls.Contains(name))
        {
            namedRange1 = this.Controls.AddNamedRange(range, name);
            namedRange1.Selected += new Excel.DocEvents_SelectionChangeEventHandler(
                    namedRange1_Selected);
        }
        else
        {
            MessageBox.Show("A named range with this specific name " +
                "already exists on the worksheet.");
        }
    }
    
    private void namedRange1_Selected(Microsoft.Office.Interop.Excel.Range Target)
    {
        MessageBox.Show("This named range was created by Visual Studio " +
            "Tools for Office.");
    }
    
  3. Adicione o método a seguir à classe Sheet1. Esse método substitui o GetAutomationObject método para retornar a instância atual da Sheet1 classe.

    protected override object GetAutomationObject()
    {
        return this;
    }
    
  4. Aplique os atributos a seguir antes da primeira linha da Sheet1 declaração de classe. Esses atributos tornam a classe visível para COM, mas sem gerar uma interface de classe.

    [System.Runtime.InteropServices.ComVisible(true)]
    [System.Runtime.InteropServices.ClassInterface(
        System.Runtime.InteropServices.ClassInterfaceType.None)]
    

Extrair uma interface para a classe Sheet1

Antes de expor o CreateVstoNamedRange método ao código VBA, você deve criar uma interface pública que defina esse método e expor essa interface ao COM.

Para extrair uma interface para a classe Sheet1

  1. No arquivo de código Sheet1.cs , clique em qualquer lugar da Sheet1 classe.

  2. No menu Refatorar, clique em Extrair Interface.

  3. Na caixa de diálogo Extrair Interface, na caixa Selecionar membros públicos para formar interface, clique na entrada do método CreateVstoNamedRange.

  4. Clique em OK.

    O Visual Studio gera uma nova interface chamada ISheet1, e modifica a definição da classe Sheet1 de modo que ela implemente a interface ISheet1. O Visual Studio também abre o arquivo ISheet1.cs no Editor de Código.

  5. No arquivo ISheet1.cs , substitua a declaração de ISheet1 interface pelo código a seguir. Esse código torna a ISheet1 interface pública e aplica o ComVisibleAttribute atributo para tornar a interface visível ao COM.

    [System.Runtime.InteropServices.ComVisible(true)]
    public interface ISheet1
    {
        void CreateVstoNamedRange(Microsoft.Office.Interop.Excel.Range range, string name);
    }
    
  6. Compile o projeto.

Expor o método ao código VBA

Para expor o CreateVstoNamedRange método ao código VBA na pasta de trabalho, defina a propriedade ReferenceAssemblyFromVbaProject para o item host de Sheet1 como True.

Para expor o método ao código VBA

  1. No Gerenciador de Soluções, clique duas vezes Sheet1.cs.

    O arquivo WorkbookWithVBA é aberto no designer, com Sheet1 visível.

  2. Na janela Propriedades , selecione a propriedade ReferenceAssemblyFromVbaProject e altere o valor para True.

  3. Clique em OK na mensagem exibida.

  4. Compile o projeto.

Chamar o método do código VBA

Agora você pode chamar o método CreateVstoNamedRange do código VBA na pasta de trabalho.

Observação

Neste passo a passo, você vai adicionar o código VBA à pasta de trabalho enquanto debuga o projeto. O código VBA adicionado a este documento será substituído na próxima vez que você compilar o projeto, pois o Visual Studio substitui o documento na pasta de saída de build por uma cópia do documento da pasta principal do projeto. Se você quiser salvar o código VBA, poderá copiá-lo no documento na pasta do projeto. Para obter mais informações, consulte Combinar personalizações em nível de documento e VBA.

Para chamar o método do código VBA

  1. Pressione F5 para executar o projeto.

  2. Na guia Desenvolvedor , no grupo Código , clique em Visual Basic.

    O Editor do Visual Basic é aberto.

  3. No menu Inserir , clique em Módulo.

  4. Adicione o código a seguir ao novo módulo.

    Esse código chama o método CreateTable no assembly de personalização. A macro acessa esse método usando o método global GetManagedClass para acessar a classe de item de host Sheet1 que você expôs ao código VBA. O GetManagedClass método foi gerado automaticamente quando você definiu a propriedade ReferenceAssemblyFromVbaProject anteriormente neste passo a passo.

    Sub CallVSTOMethod()
        Dim VSTOSheet1 As CallingCodeFromVBA.Sheet1
        Set VSTOSheet1 = GetManagedClass(Sheet1)
        Call VSTOSheet1.CreateVstoNamedRange(Sheet1.Range("A1"), "VstoNamedRange")
    End Sub
    
  5. Pressione F5.

  6. Na pasta de trabalho aberta, clique na célula A1 na Planilha1. Verifique se a caixa de mensagem é exibida.

  7. Saia do Excel sem salvar suas alterações.

Próximas etapas

Você pode saber mais sobre como chamar código em soluções do Office do VBA nestes tópicos: