Escrevendo macros VBA do zero

O gravador de macro do Excel tem muito poder, mas tem suas limitações. Conforme abordado em outro artigo, o gravador de macro geralmente registra código desnecessário e não pode registrar coisas como lógica ou interações com outros programas. Também pode ser difícil de usar para macros mais longas - você pode acabar fazendo um storyboard de suas ações com antecedência apenas para evitar cometer erros caros.

Este artigo tem como objetivo ajudá-lo a começar a codificar macros do zero no VBA. Você aprenderá onde as macros são armazenadas, escreverá uma macro básica e aprenderá os fundamentos da programação em VBA usando variáveis, lógica e loops.

Começando

VBA e o Editor Visual Basic

VBA, ou Visual Basic for Applications, é a linguagem em que as macros são escritas. Todas as macros são armazenadas como código VBA, sejam codificadas manualmente ou criadas com o gravador de macro.

Você pode acessar todo o código VBA em uma pasta de trabalho usando o Editor do Visual Basic. Este é um editor de texto especial e depurador integrado em todos os aplicativos de escritório, incluindo o Excel. Normalmente, você abrirá este editor com o ALT + F11 atalho de teclado no Excel, mas você também pode acessá-lo a partir do Desenvolvedor guia se estiver habilitado.

O Explorador de Projetos

o Explorador de Projetos é uma janela dentro do Editor VB que mostra todos os itens que podem conter código VBA. Se você não vir esta janela, pressione F5 para fazê-lo aparecer ou selecione Explorador de Projetos de Visualizar cardápio.

Clicar duas vezes em um item no Project Explorer mostrará o código desse item. Existem vários tipos de itens que podem aparecer no Project Explorer:

  • Cadernos de exercícios
  • Fichas de trabalho
  • UserForms
  • Módulos de aula
  • Módulos (as macros são armazenadas nesses itens)

Embora todos esses tipos de itens possam incluir código VBA, a prática recomendada é codificar macros em Módulos.

Fazendo sua primeira macro

Usando a lista de macros

A Lista de macros mostra todas as macros em sua pasta de trabalho. A partir desta lista, você pode editar uma macro existente ou criar uma nova.

Para criar uma nova macro usando a lista de macros:

  • Selecione a guia Desenvolvedor e clique em Macros (ou pressione ALT + F8)

  • Digite um novo nome para sua macro e clique em “Criar”

Após clicar em “Criar” o Editor VB aparecerá, mostrando a macro recém-criada. O Excel criará um novo módulo para a macro, se necessário.

Manualmente no Editor VB

Você pode adicionar uma nova macro manualmente sem a lista de macros. Esta é a melhor opção se você deseja especificar o módulo em que a macro é salva.

Para adicionar uma macro manualmente:

  • Abra o Editor VB (ALT + F11)
  • Qualquer:
    • Adicione um novo módulo clicando em Inserir> Módulo no menu (o módulo será aberto automaticamente)

    • OU, clique duas vezes em um módulo existente no Project Explorer para abri-lo

  • No módulo, digite o código para sua nova macro
Sub MyMacro () End Sub

Essas duas linhas indicam o início e o fim de uma macro chamada “MyMacro” (observe os parênteses, que são obrigatórios). Isso aparecerá na caixa de diálogo "Exibir macros" no Excel e pode ser atribuído a um botão (mesmo que não faça nada ainda).

Adicione algum código à macro

Agora, vamos adicionar algum código entre as linhas “Sub” e “End Sub” para que esta macro realmente faça algo:

Intervalo Sub MyMacro () (“A1”). Valor = “Hello World!” End Sub

Estruturas de código básicas

O objeto de alcance

O Excel VBA usa o objeto Range para representar células em uma planilha. No exemplo acima, um objeto Range é criado com o código Intervalo (“A1”) para acessar o valor da célula A1.
Objetos de intervalo são usados ​​principalmente para definir valores de células:

Intervalo (“A1”). Valor = 1
Intervalo (“A1”). Valor = "Primeira célula"

Observe que ao definir os valores das células como números, você apenas insere o número, mas ao inserir o texto, você deve cercar o texto com aspas.

Os intervalos também podem ser usados ​​para acessar muitas propriedades das células, como fonte, bordas, fórmulas e muito mais.
Por exemplo, você pode definir a fonte de uma célula como Negrito desta forma:

Intervalo (“A1”). Font.Bold = True

Você também pode definir a fórmula de uma célula:

Intervalo (“A1”). Fórmula = “= Soma (A2: A10)”

No Excel, você pode selecionar um bloco de células com o cursor (digamos, de A1 a D10) e defini-las todas em negrito. Objetos de alcance podem acessar blocos de células como este:

Intervalo (“A1: D10”). Font.Bold = True

Você também pode se referir a várias células / blocos de uma vez:

Intervalo (“A1: D10, A12: D12, G1”). Font.Bold = True

O formato para isso é o mesmo que você usaria ao selecionar células para a fórmula SUM () no Excel. Cada bloco é separado por uma vírgula e os blocos são indicados pelas células superior esquerda e inferior direita separadas por dois pontos.

Por fim, os objetos Range têm métodos integrados para realizar operações comuns em uma planilha. Por exemplo, você pode querer copiar alguns dados de um lugar para outro. Aqui está um exemplo:

Intervalo (“A1: D10”). Copiar intervalo (“F1”). PasteSpecial xlPasteValues ​​Intervalo (“F1”). PasteSpecial xlPasteFormats

Isso copia as células A1: D10 para a área de transferência e, em seguida, faz um PasteSpecial () iniciando na célula C1 - exatamente como você faria manualmente no Excel. Observe que este exemplo mostra como usar PasteSpecial () para colar apenas valores e formatos - há parâmetros para todas as opções que você veria na caixa de diálogo Colar especial.

Aqui está um exemplo colando "Tudo" em outra planilha:

Intervalo (“A1: D10”). Copiar folhas (“Folha2”). Intervalo (“A1”). PasteSpecial xlPasteAll

Declarações If

Com um Declaração If, você pode fazer uma seção do código ser executada apenas “se” uma determinada declaração for verdadeira.

Por exemplo, você pode querer deixar uma célula em negrito e colori-la de vermelho, mas apenas “se” o valor na célula for menor que 100.

If Range (“A4”). Value <100 Then Range (“A4”). Font.Bold = True Range ("A4"). Interior.Color = vbRed End If 

A estrutura adequada de uma instrução If é a seguinte (colchetes indicam componentes opcionais):

Se então

[ElseIf Then]

[Outro]

Fim se

Você pode incluir tantos ElseIf blocos conforme você gosta de testar várias condições. Você também pode adicionar um Outro bloco que só é executado se nenhuma das outras condições na instrução If for atendida.

Aqui está outro exemplo baseado no anterior, onde a célula é formatada de várias maneiras diferentes, dependendo do valor:

If Range ("A4"). Value <100 Then Range ("A4"). Font.Bold = True Range ("A4"). Interior.Color = vbRed ElseIf Range ("A4"). Value <200 Then Range ( "A4"). Font.Bold = Intervalo falso ("A4"). Interior.Color = vb Intervalo outro amarelo ("A4"). Font.Bold = Intervalo falso ("A4"). Interior.Color = vbVerde final If

No exemplo acima, a célula não está em negrito nos blocos ElseIf, onde o valor não está abaixo de 100. Você pode ninho Instruções If para evitar a duplicação de código, como este:

If Range ("A4"). Value <100 Then Range ("A4"). Font.Bold = True Range ("A4"). Interior.Color = vbRed Else Range ("A4"). Font.Bold = False ' desdobramento da fonte apenas uma vez If Range ("A4"). Value <200 Then Range ("A4"). Interior.Color = vbYellow Else Range ("A4"). Interior.Color = vbGreen End If End If

Variáveis

UMA Variável é uma parte da memória usada para armazenar informações temporárias durante a execução de uma macro. Eles são frequentemente usados ​​em loops como iteradores ou para reter o resultado de uma operação que você deseja usar várias vezes em uma macro.

Aqui está um exemplo de uma variável e como você pode usá-la:

Sub ExtractSerialNumber () Dim strSerial As String 'esta é a declaração da variável' 'As String' significa que esta variável deve conter texto 'configurando um número de série falso: Range ("A4"). Value = “serial # 804567-88 ”'Analise o número de série da célula A4 e atribua-o à variável strSerial = Mid (Range (“ A4 ”). Value, 9)' agora use a variável duas vezes, em vez de ter que analisar o número de série duas vezes Range (“ B4 ”). Valor = strSerial MsgBox strSerial End Sub 

Neste exemplo básico, a variável 'strSerial' é usada para extrair o número de série da célula A4 usando a função Mid () e, em seguida, é usada em dois outros lugares.

A maneira padrão de declarar uma variável é a seguinte:

Dim qual nome de usuário [Como modelo]

  • qual nome de usuário é o nome que você decide dar à sua variável
  • modelo é o tipo de dados da variável

O “[As modelo] ”Parte pode ser omitida - em caso afirmativo, a variável é declarada como um tipo Variant, que pode conter qualquer tipo de dados. Embora sejam perfeitamente válidos, os tipos de variante devem ser evitados, pois podem levar a resultados inesperados se você não tomar cuidado.

Existem as regras para nomes de variáveis. Eles devem começar com uma letra ou um caractere de sublinhado, não podem ter espaços, pontos, vírgulas, aspas ou os caracteres “! @ & $ # ”.

Aqui estão alguns exemplos de declarações de variáveis:

Dim strFilename As String 'estilo de nome bom - descritivo e usa prefixo Dim i As Long' estilo de nome ruim - aceitável apenas para alguns iteradores Dim SalePrice As Double 'estilo de nome ok - descritivo, mas não usa um prefixo Dim iCounter' nome ok - não muito descritivo, usa prefixo, nenhum tipo de dados

Todos esses exemplos usam esquemas de nomenclatura ligeiramente diferentes, mas todos são válidos. Não é uma má ideia prefixar o nome de uma variável com uma forma abreviada de seu tipo de dados (conforme alguns desses exemplos), uma vez que torna seu código mais legível à primeira vista.

O VBA inclui muitos tipos de dados. Os mais populares incluem:

  • Fragmento (usado para conter dados de texto)
  • Grande (usado para conter números inteiros, ou seja, sem casas decimais)
  • Dobro (usado para conter números de ponto flutuante, ou seja, casas decimais)

Uma lista completa de tipos de dados intrínsecos do VBA pode ser encontrada aqui: https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/data-type-summary

Variáveis ​​de objeto de alcance

É possível criar variáveis ​​que fazem referência a Objetos de intervalo também. Isso é útil se você quiser se referir a um intervalo específico em seu código em vários lugares - dessa forma, se precisar alterar o intervalo, você só precisará alterá-lo em um lugar.

Ao criar uma variável de objeto Range, você deve "defini-la" como uma instância de Range. Por exemplo:

Dim rMyRange como intervalo Definir rMyRange = Range (“A1: A10; D1: J10”)

Deixar a declaração “Set” de fora ao atribuir uma variável de intervalo resultará em um erro.

rotações

Loops são blocos que repetem o código dentro deles um certo número de vezes. Eles são úteis para reduzir a quantidade de código que você precisa escrever e permitem que você escreva uma parte do código que executa as mesmas ações em muitos itens diferentes relacionados.

A seguir

UMA A seguir bloco é um loop que se repete um certo número de vezes. Ele usa uma variável como um iterador para contar quantas vezes ele foi executado e essa variável iteradora pode ser usada dentro do loop. Isso torna os loops For-Next muito úteis para iteração por meio de células ou matrizes.

Aqui está um exemplo que percorre células nas linhas 1 a 100, coluna 1, e define seus valores para o valor da variável do iterador:

Dim i enquanto for i = 1 a 100 células (i, 1) .Value = i Next i

A linha “For i = 1 To 100” significa que o loop começa em 1 e termina depois de 100. Você pode definir qualquer número inicial e final que desejar; você também pode usar variáveis ​​para esses números.

Por padrão, os loops For-Next contam por 1. Se você quiser contar por um número diferente, você pode escrever o loop com um Etapa cláusula:

Para i = 5 a 100 Etapa 5

Este loop começará em 5, em seguida, adicione 5 a 'i' cada vez que o loop se repetir (então 'i' será 10 na segunda repetição, 15 na terceira e assim por diante).

Usando Etapa, você pode fazer um loop contar para trás também:

Para i = 100 para 1 etapa -1

Você também pode ninho Loops For-Next. Cada bloco requer sua própria variável para contar, mas você pode usar essas variáveis ​​em qualquer lugar que desejar. Aqui está um exemplo de como isso é útil no Excel VBA:

Dim i As Long, j As Long For i = 1 To 100 For j = 1 To 100 Cells (i, j) .Value = i * j Next j Next i

Isso permite que você percorra linhas e colunas.

AVISO: embora seja permitido, você NUNCA deve MODIFICAR a variável do iterador dentro de um bloco For-Next, uma vez que ele usa esse iterador para manter o controle do loop. Modificar o iterador pode causar um loop infinito e travar sua macro. Por exemplo:

Para i = 1 a 100 i = 1 Próximo i

Neste loop, 'I' nunca passará de 2 antes de ser redefinido para 1, e o loop se repetirá para sempre.

Para cada

Para cada blocos são muito semelhantes aos blocos For-Next, exceto que eles não usam um contador para especificar quantas vezes eles fazem loop. Em vez disso, um bloco For-Each pega uma "coleção" de objetos (como um intervalo de células) e é executado tantas vezes quanto houver objetos nessa coleção.

Aqui está um exemplo:

Dim r como intervalo para cada r No intervalo ("A15: J54") If r.Value> 0 Then r.Font.Bold = True End If Next r

Observe o uso da variável de objeto Range ‘r’. Esta é a variável iteradora usada no loop For-Each - toda vez que ocorre no loop, 'r' obtém uma referência para a próxima célula no intervalo.

Uma vantagem de usar loops For-Each no Excel VBA é que você pode fazer um loop por todas as células em um intervalo sem loops aninhados. Isso pode ser útil se você precisar percorrer todas as células em um intervalo complexo como Intervalo (“A1: D12, J13, M1: Y12”).

Uma desvantagem dos loops For-Each é que você não tem controle sobre a ordem em que as células são processadas. Embora na prática O Excel percorrerá as células em ordem, em teoria ele poderia processar as células em uma ordem completamente aleatória. Se você precisar processar células em uma ordem específica, deverá usar loops For-Next.

Do-Loop

Enquanto os blocos do próximo passo usam contadores para saber quando parar, Do-Loop os blocos são executados até que uma condição seja atendida. Para fazer isso, você usa um Até cláusula no início ou no final do bloco, que testa a condição e faz com que o loop pare quando essa condição for satisfeita.

Exemplo:

Dim str As String str = "Buffalo" Até str = “Buffalo Buffalo Buffalo Buffalo Buffalo Buffalo Buffalo” str = str & "" & "Buffalo" Loop Range ("A1"). Value = str

Neste loop, "Buffalo" é concatenado em ‘str’ todas as vezes através do loop até que corresponda à frase esperada. Neste caso, o teste é realizado no início do loop - se 'str' já fosse a frase esperada (o que não é porque não começamos dessa forma, mas se) o loop nem mesmo seria executado .

Você pode fazer o loop rodar pelo menos uma vez movendo a cláusula until para o final, assim:

Faça str = str & "" & "Buffalo" Loop até str = “Buffalo Buffalo Buffalo Buffalo Buffalo Buffalo”

Você pode usar a versão que fizer sentido em sua macro.

AVISO: você pode causar um loop infinito com um bloco Do-Loop se a condição until nunca for atendida. Sempre escreva seu código de forma que a condição until seja definitivamente atendida quando você usa este tipo de loop.

Qual é o próximo?

Depois de compreender o básico, por que não tentar aprender algumas técnicas mais avançadas? Nosso tutorial em https://easyexcel.net/excel/learn-vba-tutorial/ se baseará em tudo que você aprendeu aqui e expandirá suas habilidades com eventos, formulários de usuário, otimização de código e muito mais!

Você vai ajudar o desenvolvimento do site, compartilhando a página com seus amigos

wave wave wave wave wave