O Básico de Programação em VBA

Esta página é uma compilação de todas as seções sobre VBA apresentadas até agora no site, para consulta rápido.

Introdução

Se você é novo no VBA, é importante ler a página Visual Basic for Applications (VBA) antes de continuar. Se tiver alguma dúvida nesta página, sugiro acompanhar a página de sintaxe do vba.

Esta página ensina alguns fundamentos do VBA. Todos os termos técnicos apresentados aqui são discutidos com maior profundidade em outras páginas do site, no entanto, senti a necessidade de criar esta página porque não é possível ler sobre outros assuntos sem saber de alguns conceitos fundamentais.

A melhor forma de absorver os conceitos básicos de programação em VBA é dar exemplos e depois explicá-los. Simplifiquei ao máximo a definição técnica dos termos nesta página.

Para estudar os exemplos desta página, abra o VBE (pressione Alt+F11 na tela principal da aplicação). No VBE, mostre o Project Explorer (Ctrl+R) caso ele não esteja visível. Em seguida, insira um módulo (Alt, I, M) e cole os códigos abaixo. Veja mais em: VBE|visual-basic-editor-vbe.

Variáveis

Página principal: Variáveis

Variáveis armazenam uma informação num elemento para serem utilizadas depois. Quando damos um valor a uma variável, diz-se que estamos fazendo uma atribuição a ela. As variáveis mais utilizadas são as de tipos de dados de texto e as numéricas. O exemplo abaixo faz uma atribuição de texto à variável que estou chamando de FirstName e uma atribuição de número a uma variável que estou chamando de CurrentAge:

Sub ExemploVariáveis()
    Dim FirstName As String
    Dim CurrentAge As Long
 
    FirstName = "Felipe Costa Gualberto"
    CurrentAge = 30
End Sub
Para usar variáveis, primeiro as declare. É imprescindível que todo código que você escreva compile e esteja indentado corretamente.

Para que o VBA avalie uma sequência de caracteres como texto, deve-se colocar a expressão entre aspas duplas. Números devem ser expressos sem aspas. Se você representar números entre aspas, o VBA os avaliará como texto.

Avaliar é significa calcular e/ou processar uma expressão.

Feedback de Programas ao Usuário

As técnicas a seguir são usadas para interagir com o usuário: mostrar um aviso, o valor de uma conta matemática ou o resultado da execução de um programa.

Caixas de Mensagem (MsgBox)

Para exibir uma caixa de mensagem ao usuário, utilize a instrução MsgBox:

Sub DemonstraçãoCaixas()
    MsgBox "Olá mundo!"
End Sub

Janela de Verificação Imediata

Esse exemplo é semelhante ao anterior; a diferença é que o resultado é exibido na Janela de Verificação Imediata (Pressione Ctrl+G para exibi-la).

Sub Imediata()
    Debug.Print "Olá mundo!"
End Sub

Veja a saída desse programa:

A palavra saída é utilizada como um termo técnico que significa o resultado de um programa, uma interface ao usuário seja na forma de texto, de gráfico ou até mesmo um som.

Comentários

Você pode usar o símbolo de aspas simples ' para comentar seu código no VBA. Linhas de código ou sequências comentadas não são compiladas nem executadas pelo VBE. Por padrão, expressões de texto comentadas são exibidas na Janela de Código na cor verde. Desenvolvedores comentam códigos para efeito de documentação/explicação de um código, procedimento e/ou um programa.

Os subprocedimentos mostrados a seguir são equivalentes:

Sub ComComentários()
    'O código abaixo exibe uma caixa de texto:
    MsgBox "Caixa de texto!"
  
    Debug.Print 33 'você pode também comentar ao final de uma linha de código válida.
End Sub

Procedimento sem código:

Sub SemComentários()
    MsgBox "Caixa de texto!"
  
    Debug.Print 33
End Sub

Operações com Texto

O VBA é capaz de juntar duas ou mais expressões de texto numa só. O nome dessa técnica é concatenação:

Sub ExemploTexto()
    Dim FirstName As String
    Dim LastName As String
 
    FirstName = "Felipe"
    LastName = "Gualberto"
  
    MsgBox "Seu nome é " & Nome & " " & Sobrenome & "."
End Sub

O símbolo de concatenação é &, e para fazer uma operação de concatenação, esse símbolo deve estar fora de uma expressão de aspas duplas. Nesse exemplo, foram concatenados 5 termos, a saber:

  • Termo 1: A expressão literal “Seu nome é “
  • Termo 2: A variável Nome
  • Termo 3: A expressão literal ” “ (um espaço entre as aspas duplas)
  • Termo 4: A variável Sobrenome
  • Termo 5: A expressão literal “.” (um ponto final)
Expressão literal se refere a uma expressão explícita, que não faz uso de variáveis nem outros elementos, como "Felipe".

Veja o resultado da execução dessa macro:

Vale ressaltar que se você quiser utilizar num código uma variável que possui um texto armazenado, não é necessário representá-la com aspas duplas, já que no momento da atribuição de seu valor, foram utilizadas aspas duplas.

Operações com Números

O VBA pode ser considerado uma calculadora muito eficiente, e consegue processar operações matemáticas em velocidades incríveis. Veja algumas operações que o VBA suporta:

Sub ExemploNúmeros():
    'Soma, subtração e parênteses:
    Debug.Print 30 - (25 - (8 + 3))
  
    'Multiplicação (*) e divisão (/):
    Debug.Print 0.5 * (12 / 2)
    'Note que separador decimal do VBA é um ponto, e não uma vírgula!
 
    'Potência:
    Debug.Print 5 ^ 3
  
    'Raiz enésima de um número. Exemplo: raiz quadrada de 25 e raiz cúbica de 8:
    Debug.Print 25 ^ (1 / 2) + 8 ^ (1 / 3)
 
    'Divisão arrendondando-se ao inteiro mais próximo:
    Debug.Print 20 \ 3
    'Note que foi utilizada a contrabarra ao invés da barra.
 
    'Mostrar resto de uma divisão:
    Debug.Print 33 Mod 10
End Sub

O VBA avalia operações matemáticas da mesma forma que a matemática nos ensina: primeiro as raízes e potências, depois as multiplicações e divisões e depois as somas e subtrações. Claro, a ordem as leis dos parênteses são respeitadas.

Você pode utilizar o operador de concatenação também em números, mas nesse caso, eles não vão somar, e sim concatenar. Veja o exemplo abaixo:

Sub ConcatenarNúmeros()
    MsgBox 25 & 26
End Sub

Resulta em:

Enfim, você também pode misturar concatenações de números com textos para produzir resultados como esse:

Sub MisturarDadosEmConcatenação()
    MsgBox "Minha idade é de " & (10 + 20) & " anos."
End Sub

Resultado:

Argumentos

Argumentos são elementos utilizados por um procedimento para melhor a estrutura ou prover reaproveitamento do código. Os argumentos utilizados num procedimento são mostrados em sua declaração e são usados como variáveis pelo procedimento.

Veja o código abaixo:

Sub DadosBásicos()
    FirstName = "Felipe"
    CurrentAge = 30
    MsgBox "Seu nome é " & FirstName & " e sua idade é de " & Idade & " anos."
  
    FirstName = "Renata"
    CurrentAge = "31"
    MsgBox "Seu nome é " & FirstName & " e sua idade é de " & Idade & " anos."
  
    FirstName = "Rodrigo"
    CurrentAge = "35"
    MsgBox "Seu nome é " & FirstName & " e sua idade é de " & Idade & " anos."
End Sub

A expressão que exibe a caixa de mensagem aparece três vezes na mesma forma. Poderíamos criar um subprocedimento com argumentos para dar uma melhor forma ao nosso programa:

Sub DadosBásicos2()
    Dim FirstName As String
    Dim CurrentAge As Long
    
    FirstName = "Felipe"
    CurrentAge = 30
    MostrarDados FirstName, CurrentAge
  
    FirstName = "Renata"
    CurrentAge = "31"
    MostrarDados FirstName, CurrentAge
  
    FirstName = "Rodrigo"
    CurrentAge = "35"
    MostrarDados FirstName, CurrentAge
End Sub
 
Sub MostrarDados(pName, pAge)
    MsgBox "Seu nome é " & pName & " e sua idade é de " & pAge & " anos."
End Sub

Em cada uma das situações, Nome é avaliado, seu valor é passado ao argumento MeuNome do subprocedimento MostrarDados e esse argumento é utilizado como variável nesse subprocedimento.

Funções

Funções são procedimentos que devolvem um valor a um procedimento que o chama. A terminologia técnica correta é que funções retornam um valor. No exemplo abaixo, a função GetRendimento retorna um valor à variável RendimentoTotal:

Sub MostrarRendimentos()
  Dim DinheiroInicial As Double
  Dim TaxaRendimento As Double
  Dim RendimentoTotal As Double
  
  DinheiroInicial = 4337
  TaxaRendimento = 0.3
  RendimentoTotal = GetRendimento(DinheiroInicial, TaxaRendimento)
  
  MsgBox "O rendimento no próximo mês será de " & RendimentoTotal & " reais."
End Sub
 
Function GetRendimento(pCapital, pTaxa)
  GetRendimento = pCapital * pTaxa
End Function

Note que para retornar um valor, você deve atribuir um valor a uma variável que tenha o mesmo nome da função.

Obter Dados do Usuário

Uma forma simples de obter dados entrados pelo usuário é utilizando a função InputBox, que é uma função nativa do VBA:

Sub MostrarNome()
  MeuNome = InputBox("Qual é o seu nome?")
  
  MsgBox "Seu nome é " & MeuNome & "!"
End Sub

Blocos de Decisão

Para melhor entendimento, depure (tecla F8) ao invés de executar os exemplos desta seção.

O VBA executa blocos de código de acordo com uma condição. O exemplo abaixo executa o primeiro bloco da estrutura de decisão If se a variável Idade for menor que 18:

Sub Maioridade()
    Dim CurrentAge As Long
  
    CurrentAge = InputBox("Digite sua idade")
  
    If CurrentAge < 18 Then
        MsgBox "Você é menor."
    Else
        MsgBox "Você já atingiu a maioridade."
    End If
End Sub

Veja um exemplo de uma estrutura de decisão do tipo Select Case:

Sub Conceito()
    Dim NotaProva As Long
    Dim ConceitoProva As String
    
    NotaProva = InputBox("Qual nota você tirou na prova (0 a 100)?")
    
    Select Case NotaProva
        Case 0 To 50
            ConceitoProva = "F"
        Case Is < 60
            ConceitoProva = "E"
        Case Is < 70
            ConceitoProva = "D"
        Case Is < 80
            ConceitoProva = "C"
        Case Is < 90
            ConceitoProva = "B"
        Case Is <= 100
            ConceitoProva = "A"
        Case Else
            MsgBox "Valor inserido inválido."
            Exit Sub
    End Select
 
    MsgBox "Seu conceito foi " & ConceitoProva & "."
End Sub

No exemplo acima, a instrução Exit Sub finaliza a execução de um procedimento. Para funções, você deve usar Exit Function. Informalmente, falamos que a instrução Exit sai do procedimento. Ela é equivalente à End Sub (para subprocedimentos) ou End Function (para funções).

Laços

Laços são blocos de código que se repetem de acordo com uma condição.

Laços For...Next são muito utilizados. Nesse tipo de laço, atribui-se um valor inicial a uma variável, que a cada ciclo no laço, tem seu valor incrementado até o valor máximo ser alcançado.

O código abaixo mostra um laço com 10 repetições e, por fim, uma caixa de mensagem:

Sub LaçoForNext()
  For i = 11 To 20
    Debug.Print "O valor da variável i é: " & i
  Next i
  
  MsgBox "Fim da Macro!"
End Sub

Linhas de Código Extensas

Muitas vezes acontece de você escrever uma linha de texto tão grande, que ela não cabe na tela de seu VBE:

É possível quebrar uma linha de código extensa em várias linhas. Para tal, dê um espaço e digite o símbolo _ (sublinhado) no final da linha que deseja quebrar. Veja como eu reescreveria o exemplo acima:

Sub LinhaExtensa2()
    MsgBox "Este é um exemplo de linha de código muito grande. " _
    & "Este exemplo mostra a instrução Msgbox para exibir uma " _
    & "mensagem com um texto tão grande, que a janela do VBE " _
    & "não consgue mostrar toda linha de código nessa janela."
End Sub

Objetos e Coleções no Office

No Office, um objeto pode representar uma planilha, um documento Word, uma AutoForma do PowerPoint, um item de e-mail do Outlook e muito mais. Existem centenas de objetos em cada aplicativo, compondo o que chamamos de modelo de objeto.

Coleções

Uma coleção é um objeto que funciona como um container que pode armazenar vários itens (normalmente do mesmo tipo de dados) dentro dele.

Considere o cenário em que você tenha no Excel uma pasta de trabalho que possui 3 planilhas (abas). Em termos técnicos, a pasta de trabalho possui uma propriedade que é a coleção Worksheets. Considerando que as planilhas se chamam PlanBanco, PlanResumo e PlanLog, você pode acessá-las através de Worksheets("PlanBanco"), Worksheets("PlanResumo"), Worksheets("PlanLog") ou pelo seu índice Worksheets(1), Worksheets(2) e Worksheets(3).

Vale ressaltar que Worksheets(1).ProtectContents acessa a propriedade de um determinado item da coleção Worksheets. Em outras palavras, a coleção Worksheets não possui a propriedade ProtectContents, mas sim o item que está sendo acessado. Logo, está sendo acessado um item da coleção nessa sintaxe.

Hierarquia de Objetos

O modelo de objeto do Office é hierárquico. O Excel é um objeto e possui uma coleção de objetos filhos, que são as pastas de trabalho que estão abertas. Cada pasta de trabalho possui várias planilhas, e cada uma das planilhas possuem várias células. A hierarquia desse exemplo Excel >> Pasta de Trabalho >> Planilha >> Célula. Quando especificamos:

Workbooks("Pasta1.xlsm").Worskheets("Plan1").Range("C2").Value = "Felipe!"

Estamos nos referindo à célula C2 da planilha Plan1 da pasta de trabalho Pasta1.xlsm aberta no Excel. Observe que a hierarquia de objetos é separada por pontos e sua ordem de abrangência se dá da esquerda para a direita. Value se refere a uma propriedade do objeto (nesse caso o objeto Range). O termo técnico empregado para o objeto Range quando especificamos seu objeto pai é qualificação.

Os aplicativos, por padrão, permitem que você escreva expressões sem qualificá-las ou qualifica-las parcialmente. Por exemplo, se você escrever:

Worksheets("Plan1").Range("C2").Value = "Felipe!"

O Excel atribuirá valor à célula C2 da planilha Plan1 da pasta de trabalho ativa.

E se usarmos:

Range("B2").Value = "Felipe"

O Excel atribuirá valor à célula B2 da planilha ativa.

 

Sobre Felipe Gualberto

Microsoft Most Valuable Professional (MVP) de Excel.
Esta entrada foi publicada em Tutoriais e marcada com a tag , , , , , , , , , , , , , , . Adicione o link permanente aos seus favoritos.