Escrevendo Seu Primeiro Procedimento VBA
Deslize para mostrar o menu
Gravar macros ensina o vocabulário; escrever uma do zero é onde você começa a pensar como um programador.
A Anatomia de um Sub Procedure
Todo bloco reutilizável de código VBA que executa uma ação (em vez de retornar um valor, que seria uma Function) é escrito como um Sub:
Sub ProcedureName()
' instructions go here
End Sub
Com o cursor em qualquer lugar dentro de um Sub, pressione F5 (ou clique na seta verde Executar) para executá-lo. Comentários — qualquer linha iniciada com um apóstrofo (') — são completamente ignorados pelo VBA; use-os generosamente para explicar por que o código faz algo, não apenas o que ele faz, já que o que geralmente é óbvio ao ler o próprio código.
Hábitos de Formatação que Compensam Imediatamente
- Digite
Option Explicitno topo de todo módulo — isso obriga você a declarar todas as variáveis, evitando erros de digitação antes que se tornem bugs; - Indente o código dentro de loops e blocos
Ifcom um Tab — o VBE não exige isso, mas código sem indentação se torna ilegível rapidamente; - Use nomes descritivos (
HighEarnerCount, e nãox) — você vai agradecer a si mesmo daqui a três semanas.
Exemplo Prático: Destacando Altos Salários
Vamos escrever, manualmente, um procedimento que percorre cada funcionário na tabela e destaca quem ganha mais de $55,000 — algo que o gravador de macros nunca conseguiria fazer, pois exige uma decisão (um comando If) repetida para cada linha (um loop).
Option Explicit
Sub HighlightTopEarners()
Dim ws As Worksheet
Dim i As Long
Dim lastRow As Long
Set ws = ThisWorkbook.Worksheets("Employees")
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
If ws.Cells(i, 6).Value > 55000 Then
ws.Cells(i, 6).Interior.Color = RGB(198, 239, 206)
End If
Next i
MsgBox "Done — high earners are highlighted."
End Sub
Dim ws As Worksheet / Dim i As Long— estas linhas declaram duas variáveis:wsarmazenará uma referência à planilha Employees, eiserá usada para contar as linhas;- Set
ws = ThisWorkbook.Worksheets("Employees")— este é o hábito do modelo de objetos: nomear a planilha explicitamente em vez de depender da que estiver ativa; ws.Cells(ws.Rows.Count, 1).End(xlUp).Row— um padrão comum para encontrar a última linha usada na colunaA, independentemente de quantos funcionários estejam na tabela;For i = 2 To lastRow ... Next i— um loop que repete o código para cada linha de dados, começando na linha 2 para pular o cabeçalho;- If
ws.Cells(i, 6).Value > 55000 Then— uma decisão: apenas as linhas em que a coluna Salary (coluna 6) excede 55000 serão formatadas; MsgBox— um pop-up simples confirmando que a macro foi concluída.
Digite este procedimento em modIntro, coloque o cursor dentro dele e pressione F5. Verifique os números você mesmo — Emma Davis e Olivia Brown são as duas funcionárias que recebem mais de $55.000 na tabela de exemplo.
Tarefa
- Digite
HighlightTopEarnersexatamente como mostrado em modIntro e execute-o. Confirme que duas linhas ficam verdes. - Duplique o procedimento como
HighlightITDepartmente altere a condição para destacar qualquer linha em que o Departamento (coluna 3) seja igual a "IT" em vez de verificar o Salário. - Adicione um comentário acima de cada procedimento explicando, em uma frase, o que ele faz — pratique escrever comentários para o leitor, não para você mesmo.
- Salve a planilha novamente (ainda está em
.xlsm, então um simplesCtrl+Sé suficiente).
- Selecione todo o procedimento
HighlightTopEarners(deSubatéEnd Sub), copie e cole logo abaixo dele mesmo emmodIntro. - Renomeie a linha
Subda segunda cópia paraSub HighlightITDepartment()— cada procedimento em um módulo precisa de um nome único, senão o VBA não saberá qual executar. - A condição a ser alterada é a linha
If. Atualmente, ela verifica um número:
If ws.Cells(i, 6).Value > 55000 Then
Agora, é necessário verificar um texto — coluna 3 (Department) igual a "IT". Lembre-se do Capítulo 2 que comparações de texto precisam de aspas ao redor do valor a ser comparado e utilize = em vez de >.
4. Todo o restante dentro do loop (a linha Interior.Color, a estrutura do loop) pode permanecer igual — apenas a condição testada muda.
Adicionando Comentários
- Uma linha de comentário começa com um apóstrofo (
') e fica em uma linha própria diretamente acima da linhaSub— não dentro do procedimento. - Escreva como se estivesse explicando a macro para um colega que nunca a viu, não como um lembrete para você mesmo. Compare:
- Pouco útil:
' loops through rows(descreve como, o que o código já mostra) - Mais útil:
' Highlights employees earning over $55,000(descreve o que realiza, o que não é óbvio à primeira vista)
- Pouco útil:
- Faça o mesmo para o segundo procedimento — uma frase descrevendo o que ele destaca e por quê, em termos do objetivo de negócio (funcionários do departamento de TI), não da mecânica do loop.
' Highlights employees earning over $55,000, to flag top earners at a glance.
Sub HighlightTopEarners()
Dim ws As Worksheet
Dim i As Long
Dim lastRow As Long
Set ws = ThisWorkbook.Worksheets("Employees")
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
If ws.Cells(i, 6).Value > 55000 Then
ws.Cells(i, 6).Interior.Color = RGB(198, 239, 206)
End If
Next i
MsgBox "Done — high earners are highlighted."
End Sub
' Highlights every employee who works in the IT department.
Sub HighlightITDepartment()
Dim ws As Worksheet
Dim i As Long
Dim lastRow As Long
Set ws = ThisWorkbook.Worksheets("Employees")
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
If ws.Cells(i, 3).Value = "IT" Then
ws.Cells(i, 3).Interior.Color = RGB(198, 239, 206)
End If
Next i
MsgBox "Done — IT department is highlighted."
End Sub
Digite ambos em modIntro, execute primeiro o HighlightTopEarners e confirme que exatamente duas linhas ficam verdes (Emma Davis com $62.000 e Sophia Miller com $59.000 — os outros três estão em ou abaixo de $55.000), depois execute HighlightITDepartment e confirme que a linha de Sophia Miller é destacada. Salve com Ctrl+S quando ambos estiverem funcionando.
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
Escrevendo Seu Primeiro Procedimento VBA
Gravar macros ensina o vocabulário; escrever uma do zero é onde você começa a pensar como um programador.
A Anatomia de um Sub Procedure
Todo bloco reutilizável de código VBA que executa uma ação (em vez de retornar um valor, que seria uma Function) é escrito como um Sub:
Sub ProcedureName()
' instructions go here
End Sub
Com o cursor em qualquer lugar dentro de um Sub, pressione F5 (ou clique na seta verde Executar) para executá-lo. Comentários — qualquer linha iniciada com um apóstrofo (') — são completamente ignorados pelo VBA; use-os generosamente para explicar por que o código faz algo, não apenas o que ele faz, já que o que geralmente é óbvio ao ler o próprio código.
Hábitos de Formatação que Compensam Imediatamente
- Digite
Option Explicitno topo de todo módulo — isso obriga você a declarar todas as variáveis, evitando erros de digitação antes que se tornem bugs; - Indente o código dentro de loops e blocos
Ifcom um Tab — o VBE não exige isso, mas código sem indentação se torna ilegível rapidamente; - Use nomes descritivos (
HighEarnerCount, e nãox) — você vai agradecer a si mesmo daqui a três semanas.
Exemplo Prático: Destacando Altos Salários
Vamos escrever, manualmente, um procedimento que percorre cada funcionário na tabela e destaca quem ganha mais de $55,000 — algo que o gravador de macros nunca conseguiria fazer, pois exige uma decisão (um comando If) repetida para cada linha (um loop).
Option Explicit
Sub HighlightTopEarners()
Dim ws As Worksheet
Dim i As Long
Dim lastRow As Long
Set ws = ThisWorkbook.Worksheets("Employees")
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
If ws.Cells(i, 6).Value > 55000 Then
ws.Cells(i, 6).Interior.Color = RGB(198, 239, 206)
End If
Next i
MsgBox "Done — high earners are highlighted."
End Sub
Dim ws As Worksheet / Dim i As Long— estas linhas declaram duas variáveis:wsarmazenará uma referência à planilha Employees, eiserá usada para contar as linhas;- Set
ws = ThisWorkbook.Worksheets("Employees")— este é o hábito do modelo de objetos: nomear a planilha explicitamente em vez de depender da que estiver ativa; ws.Cells(ws.Rows.Count, 1).End(xlUp).Row— um padrão comum para encontrar a última linha usada na colunaA, independentemente de quantos funcionários estejam na tabela;For i = 2 To lastRow ... Next i— um loop que repete o código para cada linha de dados, começando na linha 2 para pular o cabeçalho;- If
ws.Cells(i, 6).Value > 55000 Then— uma decisão: apenas as linhas em que a coluna Salary (coluna 6) excede 55000 serão formatadas; MsgBox— um pop-up simples confirmando que a macro foi concluída.
Digite este procedimento em modIntro, coloque o cursor dentro dele e pressione F5. Verifique os números você mesmo — Emma Davis e Olivia Brown são as duas funcionárias que recebem mais de $55.000 na tabela de exemplo.
Tarefa
- Digite
HighlightTopEarnersexatamente como mostrado em modIntro e execute-o. Confirme que duas linhas ficam verdes. - Duplique o procedimento como
HighlightITDepartmente altere a condição para destacar qualquer linha em que o Departamento (coluna 3) seja igual a "IT" em vez de verificar o Salário. - Adicione um comentário acima de cada procedimento explicando, em uma frase, o que ele faz — pratique escrever comentários para o leitor, não para você mesmo.
- Salve a planilha novamente (ainda está em
.xlsm, então um simplesCtrl+Sé suficiente).
- Selecione todo o procedimento
HighlightTopEarners(deSubatéEnd Sub), copie e cole logo abaixo dele mesmo emmodIntro. - Renomeie a linha
Subda segunda cópia paraSub HighlightITDepartment()— cada procedimento em um módulo precisa de um nome único, senão o VBA não saberá qual executar. - A condição a ser alterada é a linha
If. Atualmente, ela verifica um número:
If ws.Cells(i, 6).Value > 55000 Then
Agora, é necessário verificar um texto — coluna 3 (Department) igual a "IT". Lembre-se do Capítulo 2 que comparações de texto precisam de aspas ao redor do valor a ser comparado e utilize = em vez de >.
4. Todo o restante dentro do loop (a linha Interior.Color, a estrutura do loop) pode permanecer igual — apenas a condição testada muda.
Adicionando Comentários
- Uma linha de comentário começa com um apóstrofo (
') e fica em uma linha própria diretamente acima da linhaSub— não dentro do procedimento. - Escreva como se estivesse explicando a macro para um colega que nunca a viu, não como um lembrete para você mesmo. Compare:
- Pouco útil:
' loops through rows(descreve como, o que o código já mostra) - Mais útil:
' Highlights employees earning over $55,000(descreve o que realiza, o que não é óbvio à primeira vista)
- Pouco útil:
- Faça o mesmo para o segundo procedimento — uma frase descrevendo o que ele destaca e por quê, em termos do objetivo de negócio (funcionários do departamento de TI), não da mecânica do loop.
' Highlights employees earning over $55,000, to flag top earners at a glance.
Sub HighlightTopEarners()
Dim ws As Worksheet
Dim i As Long
Dim lastRow As Long
Set ws = ThisWorkbook.Worksheets("Employees")
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
If ws.Cells(i, 6).Value > 55000 Then
ws.Cells(i, 6).Interior.Color = RGB(198, 239, 206)
End If
Next i
MsgBox "Done — high earners are highlighted."
End Sub
' Highlights every employee who works in the IT department.
Sub HighlightITDepartment()
Dim ws As Worksheet
Dim i As Long
Dim lastRow As Long
Set ws = ThisWorkbook.Worksheets("Employees")
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
If ws.Cells(i, 3).Value = "IT" Then
ws.Cells(i, 3).Interior.Color = RGB(198, 239, 206)
End If
Next i
MsgBox "Done — IT department is highlighted."
End Sub
Digite ambos em modIntro, execute primeiro o HighlightTopEarners e confirme que exatamente duas linhas ficam verdes (Emma Davis com $62.000 e Sophia Miller com $59.000 — os outros três estão em ou abaixo de $55.000), depois execute HighlightITDepartment e confirme que a linha de Sophia Miller é destacada. Salve com Ctrl+S quando ambos estiverem funcionando.
Obrigado pelo seu feedback!