Como se tornar um expert em VBA aprendendo apenas um código básico
28/12/2024
Aprenda um único código VBA versátil e de poucas linhas e, com poucos ajustes, use-o para infinitas aplicações no Excel. Id: 33

Modelo Básico, Simples e Extremamente Versátil de Código VBA para Excel
O VBA (Visual Basic for Applications) é uma poderosa ferramenta para automação de tarefas no Excel. Neste artigo, vamos apresentar um modelo básico, simples e versátil, com poucas linhas de código VBA, que pode ser ajustado para uma infinidade de aplicações com bem poucas mudanças. Além disso, apresentaremos exemplos práticos e inovadores para ilustrar sua utilidade. Posso garantir que, após aprender esse código e utilizá-lo com alguma frequência, você passará a escrever seus programas em VBA com alguma variação desse algoritmo. E o melhor: seus esforços de memorização de sintaxe se reduzirão à compreensão do método.
Apresentação do Modelo Básico
Para utilizar o código VBA, abra o Excel, pressione Alt + F11 para abrir o editor VBA, insira um novo módulo e cole o código abaixo. Depois, ajuste os parâmetros para adequá-lo às suas necessidades. Esse é o código que, com os ajustes necessários em cada caso, será utilizado para inúmeras outras aplicações. Basicamente, a maioria das aplicações VBA envolve um ou mais loops semelhantes aos do modelo. E o método de acesso, leitura e escrita às células adjacentes à célula atual são realizados com muita eficiência utilizando-se o método .offset(0,x), onde x é o deslocamento lateral entre colunas da mesma linha (por isso o 0 no primeiro parâmetro).
Sub ModeloBasico()'A colunaOrigem serve como referencial p/ o deslocamento (offset)Dim colunaOrigem As RangeDim celulaOrigem As Range' Defina a coluna de origemSet colunaOrigem = Worksheets("Plan1").Range("A1:A20")' Iteração pelas células referenciadas a partir da coluna origemFor Each celulaOrigem In colunaOrigem' Adicione a lógica desejada aqui' Por exemplo, supondo-se que na primeira coluna à direita da colunaOrigem' se queira o número da linha, e, ao lado, esse número elevado ao quadrado:celulaOrigem.Value = "Célula" & CStr(celulaOrigem.Row)celulaOrigem.Offset(0, 1).Value = celulaOrigem.RowcelulaOrigem.Offset(0, 2).Value = celulaOrigem.Offset(0, 1).Value * celulaOrigem.Offset(0, 1).ValueNext celulaOrigemEnd Sub
Exemplo 1: Filtragem e Comparação de Valores na Mesma Planilha
Este exemplo compara valores da coluna A com os da coluna B, e lista na coluna C os valores não encontrados na coluna B.
Sub CompararValores()' Colunas referenciaisDim colunaOrigem As Range, colunaComparacao As Range' Células de trabalhoDim celulaOrigem As Range, celulaDestino As Range' Defina as colunas de origem, comparação e a célula de destinoSet colunaOrigem = Worksheets("Plan1").Range("A2:A101")Set colunaComparacao = Worksheets("Plan1").Range("B2:B51")Set celulaDestino = Worksheets("Plan1").Range("C1")' Iteração pelos valores da colunaOrigemFor Each celulaOrigem In colunaOrigem' Verifique se o valor não está presente na coluna de comparaçãoIf IsError(Application.Match(celulaOrigem.Value, colunaComparacao, 0)) Then' Se não estiver, copie o valor para a celulaDestinoSet celulaDestino = celulaDestino.Offset(1, 0)celulaDestino.Value = celulaOrigem.ValueEnd IfNext celulaOrigemEnd Sub
Para testar a macro do exemplo 1, gere dados aleatórios. Para isso, copie e cole este código no editor VBA e o execute:
Sub criaDadosAleatorios()Dim frutas As VariantDim indiceAleatorio As IntegerDim nomeAleatorio As StringDim numeroAleatorio As IntegerDim i As IntegerDim dict As ObjectDim valoresUnicos As CollectionDim valoresAleatorios As CollectionDim j As IntegerDim valor As StringDim contador As IntegerDim existe As Boolean' Array de frutasfrutas = Array("Abacate", "Banana", "Caju", "Damasco", "Embaúba", "Figo", "Goiaba", "Imbu", "Jaca", "Kiwi", "Limão", "Maçã", "Nêspera", "Pera", "Romã", "Tangerina", "Uva")' Cria um dicionário para evitar duplicatas na coluna ASet dict = CreateObject("Scripting.Dictionary")' Cria uma coleção para armazenar valores únicosSet valoresUnicos = New Collection' Cabeçalho nas células A1, B1 e C1Worksheets("Plan1").Range("A1").Value = "Nomes"Worksheets("Plan1").Range("B1").Value = "Nomes a comparar"Worksheets("Plan1").Range("C1").Value = "Nomes não selecionados"' Limpa a coluna CWorksheets("Plan1").Range("C2:C101").Value = ""' Preenche as células de A2 até A100 com valores únicosFor i = 2 To 101indiceAleatorio = Application.WorksheetFunction.RandBetween(0, UBound(frutas))nomeAleatorio = frutas(indiceAleatorio)numeroAleatorio = Application.WorksheetFunction.RandBetween(1, 100)valor = nomeAleatorio & " " & numeroAleatorioIf Not dict.exists(valor) Thendict.Add valor, TruevaloresUnicos.Add valorWorksheets("Plan1").Range("A" & i).Value = valorElsei = i - 1End IfNext i' Cria uma coleção para armazenar os valores aleatórios que irão para a coluna BSet valoresAleatorios = New Collectioncontador = 0' Tenta escolher 50 valores aleatórios da coleção de valores únicosDo While valoresAleatorios.Count < 50 And valoresAleatorios.Count < valoresUnicos.Countj = Application.WorksheetFunction.RandBetween(1, valoresUnicos.Count)valor = valoresUnicos(j)existe = FalseFor Each v In valoresAleatoriosIf v = valor Thenexiste = TrueExit ForEnd IfNext vIf Not existe ThenvaloresAleatorios.Add valorEnd Ifcontador = contador + 1If contador > 100 Then Exit DoLoop' Verifica se conseguimos escolher 50 valores, se não, ajusta para os disponíveisIf valoresAleatorios.Count < 50 ThenMsgBox "Apenas " & valoresAleatorios.Count & " valores únicos foram selecionados."End If' Copia os valores aleatórios para a coluna BFor i = 1 To valoresAleatorios.CountWorksheets("Plan1").Range("B" & i + 1).Value = valoresAleatorios(i)Next i' Cria a tabelaWith ThisWorkbook.Sheets("Plan1").ListObjects.Add(xlSrcRange, .Range("A1:C101"), , xlYes).Range.ColumnWidth = 25End WithEnd Sub
Exemplo 2: Atualização de Dados Baseados em Condições e Cálculos Simples
Este exemplo verifica os valores em uma coluna de origem, calcula um valor condicional com base neles e escreve os resultados em uma nova coluna. Ele utiliza exclusivamente Offset para realizar todas as leituras e escritas, sem a criação de novas variáveis intermediárias.
Sub AtualizarDadosComOffset()' Define a variável celulaOrigemDim celulaOrigem As Range' Define a coluna base de origemDim colunaOrigem As Range' Define a coluna de origem a partir de uma faixa específica na Planilha1Set colunaOrigem = Worksheets("Plan1").Range("C3:C102")' Itera sobre cada célula na coluna de origemFor Each celulaOrigem In colunaOrigem' Verifica se o valor na célula origem é maior que 20000If celulaOrigem.Value > 20000 Then' Calcula um novo valor baseado em uma fórmula simples e escreve na coluna destinocelulaOrigem.Offset(0, 1).Value = celulaOrigem.Value * 0.10Else' Escreve um texto indicando que o valor não atingiu a condiçãocelulaOrigem.Offset(0, 1).Value = "Valor abaixo do limite de R$ 20000,00"End If' Adiciona uma segunda saída em uma terceira coluna, com um texto indicando a análisecelulaOrigem.Offset(0, 2).Value = "Analisado: " & celulaOrigem.Offset(0, -1).ValueNext celulaOrigem' Exibe uma mensagem indicando que a atualização foi concluídaMsgBox "Atualização concluída!"End Sub
Explicação do Exemplo:
Leitura Base: A coluna C (definida como colunaOrigem) contém os valores iniciais para análise.
Escrita Condicional: Na coluna D (1 coluna à direita da base), é escrito o valor multiplicado por 0.1 se a condição (maior do que R$ 20000,00) for atendida. Isso equivale a 10% do valor considerado.
Caso contrário, o texto "Valor abaixo do limite de R$ 20000,00" é inserido.
Adição de Observações: Na coluna E (2 colunas à direita da base), é inserido um texto contendo uma observação de exemplo quanto aos valores analisados.
Uso Intenso do Offset: Todas as leituras e escritas são feitas com deslocamento a partir da célula de origem, sem a criação de variáveis adicionais.
Este exemplo é particularmente útil em análises que envolvem cálculos simples e geração de relatórios diretamente no Excel. Ele demonstra como o Offset pode ser utilizado de maneira eficiente para manipular dados adjacentes em uma planilha.
Para testar o exemplo 2, gere códigos aleatórios. Rode a macro abaixo para isso:
Sub GerarDadosAleatorios()Dim i As LongDim ws As WorksheetSet ws = Worksheets("Plan1")' Limpa os dados existentesws.Range("B1:E102").ClearContents' Preenche os cabeçalhos:ws.Range("B2:E2").Value = Array("Nome", "Valor", "10%", "Observacao")' Preenche a coluna C com valores aleatórios entre 10.000 e 50.000For i = 3 To 102ws.Cells(i, 2).Value = "Nome" & ws.Cells(i, 1).Row - 2ws.Cells(i, 3).Value = Int((50000 - 10000 + 1) * Rnd + 10000)Next iEnd Sub
Exemplo 3: Totalização de Valores de Planilhas Diferentes
Neste exemplo, a macro realiza a totalização das vendas ocorridas por vendedor e produto. Para isso, faz a leitura dos valores constantes de 3 planilhas de dados e gera uma planilha de resultados com a totalização dessas vendas.
Sub criaTotalizacaoSimples()Dim novaPlanilha As WorksheetDim planilha As WorksheetDim colunaOrigem As RangeDim celulaOrigem As RangeDim linhaDestino As LongDim linhaAtual As LongDim total As Double' Cria a planilha totalizacaoVendasSet novaPlanilha = ThisWorkbook.Worksheets.AddnovaPlanilha.Name = "totalizacaoVendas"novaPlanilha.Cells.Clear' Configura cabeçalhonovaPlanilha.Range("A1").Value = "Vendedor"novaPlanilha.Range("B1").Value = "Produto"novaPlanilha.Range("C1").Value = "Total de Vendas ($)"linhaDestino = 2' Itera pelas planilhas Plan*For Each planilha In ThisWorkbook.WorksheetsIf planilha.Name Like "Plan*" ThenSet colunaOrigem = planilha.Range("A2:A21")For Each celulaOrigem In colunaOrigem' Busca se já existe uma linha para o vendedor/produtototal = celulaOrigem.Offset(0, 2).ValueFor linhaAtual = 2 To linhaDestino - 1If novaPlanilha.Cells(linhaAtual, 1).Value = celulaOrigem.Value And novaPlanilha.Cells(linhaAtual, 2).Value = celulaOrigem.Offset(0, 1).Value ThennovaPlanilha.Cells(linhaAtual, 3).Value = novaPlanilha.Cells(linhaAtual, 3).Value + totalExit ForEnd IfNext linhaAtual' Se não encontrou, adiciona uma nova linhaIf linhaAtual = linhaDestino ThennovaPlanilha.Cells(linhaDestino, 1).Value = celulaOrigem.ValuenovaPlanilha.Cells(linhaDestino, 2).Value = celulaOrigem.Offset(0, 1).ValuenovaPlanilha.Cells(linhaDestino, 3).Value = totallinhaDestino = linhaDestino + 1End IfNext celulaOrigemEnd IfNext planilha' Formata a coluna de valores como moedanovaPlanilha.Columns(3).NumberFormat = "$ #,##0.00"End Sub
Para testar a macro do exemplo 3, gere dados aleatórios. Para isso, copie e cole este código no editor VBA e o execute. Esta mesma planilha poderá também ser usada nos testes do exemplo 4 (a seguir):
Sub criaDadosAleatorios()Dim pessoas As VariantDim produtos As VariantDim planilha As WorksheetDim i As IntegerDim j As IntegerDim indicePessoa As IntegerDim indiceProduto As IntegerDim valorVenda As DoubleDim nomePessoa As StringDim nomeProduto As Stringpessoas = Array("João", "Maria", "Carlos", "Ana", "Luís", "Paula", "Roberto")produtos = Array("Produto A", "Produto B", "Produto C", "Produto D", "Produto E", "Produto F", "Produto G")For Each planilha In ThisWorkbook.WorksheetsIf planilha.Name Like "Plan*" Thenplanilha.Cells.Clearplanilha.Cells(1, 1).Value = "Nome"planilha.Cells(1, 2).Value = "Produto"planilha.Cells(1, 3).Value = "Valor de Venda (R$)"For i = 2 To 21For j = 1 To 7indicePessoa = Application.WorksheetFunction.RandBetween(0, UBound(pessoas))indiceProduto = Application.WorksheetFunction.RandBetween(0, UBound(produtos))valorVenda = Application.WorksheetFunction.RandBetween(10000, 300000) / 10nomePessoa = pessoas(indicePessoa)nomeProduto = produtos(indiceProduto)planilha.Cells(i, 1).Value = nomePessoaplanilha.Cells(i, 2).Value = nomeProdutoplanilha.Cells(i, 3).Value = valorVendaNext jNext i' Formata a coluna 3 (valor de venda) como Moedaplanilha.Columns(3).NumberFormat = "$ #,##0.00"End IfNext planilhaEnd Sub
Exemplo 4: Criação de Nova Tabela com Filtragem
Para testar este exemplo, pode-se aproveitar a mesma tabela de dados gerada para o exemplo 3, visto acima. Este exemplo lê dados de "Plan1", "Plan2" e "Plan3", aplica uma filtragem, e cria uma nova tabela de resultados com os valores que atendem aos critérios definidos. Por exemplo, podemos criar uma tabela apenas com as vendas superiores a R$ 20.000,00.
Sub CriarTabelaFiltrada()Dim colunasOrigem(1 To 3) As RangeDim planilhasOrigem(1 To 3) As StringDim planilhaDestino As WorksheetDim celulaOrigem As RangeDim celulaDestino As RangeDim linhaAtual As LongDim ws As WorksheetDim planilhaExiste As Boolean' Nomes das planilhas de origem e configuração das colunas de origemplanilhasOrigem(1) = "Plan1"planilhasOrigem(2) = "Plan2"planilhasOrigem(3) = "Plan3"' Verifica se a planilha "Resultados" já existeplanilhaExiste = FalseFor Each ws In ThisWorkbook.WorksheetsIf ws.Name = "Resultados" ThenplanilhaExiste = TrueSet planilhaDestino = wsExit ForEnd IfNext ws' Se não existir, cria a planilha "Resultados"If Not planilhaExiste ThenSet planilhaDestino = ThisWorkbook.Worksheets.AddplanilhaDestino.Name = "Resultados"End If' Limpa os dados da planilha de destino antes de iniciarplanilhaDestino.Cells.ClearlinhaAtual = 3 ' Inicia na linha 3 para o resultado' Configura o cabeçalho da tabela de destinoplanilhaDestino.Range("B2:D2").Value = Array("Vendedor", "Produto", "Valor da Venda")planilhaDestino.Range("B2:D2").Font.Bold = TrueplanilhaDestino.Columns("B:D").AutoFit' Itera pelas planilhas de origemDim i As IntegerFor i = 1 To 3' Define o intervalo de origemSet colunasOrigem(i) = Worksheets(planilhasOrigem(i)).Range("C2:C21")' Itera pelas células da coluna de origemFor Each celulaOrigem In colunasOrigem(i)' Condição para valores numéricos maiores que 20000If IsNumeric(celulaOrigem.Value) And celulaOrigem.Value > 20000 Then' Copia os dados para a linha atual da planilha de destinoSet celulaDestino = planilhaDestino.Cells(linhaAtual, 2)celulaDestino.Value = celulaOrigem.Offset(0, -2).Value ' VendedorcelulaDestino.Offset(0, 1).Value = celulaOrigem.Offset(0, -1).Value ' ProdutocelulaDestino.Offset(0, 2).Value = celulaOrigem.Value ' Valor da VendalinhaAtual = linhaAtual + 1End IfNext celulaOrigemNext i' Formatação finalplanilhaDestino.Columns("C").NumberFormat = "$ #,##0.00"planilhaDestino.Columns("B:D").AutoFitMsgBox "Tabela de resultados criada com sucesso na planilha 'Resultados'!", vbInformationEnd Sub
Esses exemplos demonstram a flexibilidade e o poder do modelo básico apresentado. Com pequenos ajustes, ele pode ser adaptado para uma infinidade de aplicações no Excel, otimizando tarefas e poupando tempo.
Confira o vídeo tutorial detalhado sobre este processo no nosso canal do YouTube: Clique aqui para assistir (https://youtu.be/upc43h6g8nI).