Aprendi VBA em 2023

2023 foi um ano de muitos aprendizados... ... e um deles foi aprender VBA (Visual Basic for Applications).

Recentemente mudei de emprego e me encontrei como Analista de Dados! Mudar de emprego me trouxe novos ares e novas perspectivas, e ainda em uma nova área, novos mares para desbravar.

De muitas coisas que gostaria de compartilhar sobre 2023, uma delas é contar o que aprendi com o VBA em pleno século XXI. Adianto que não tenho domínio completo, porém me diverti bastante com ele em 2023!

Tela padrão do VBA, com um Olá Mundo!
Esse botão tímido pode trazer grandes (e boas) consequências!

Ok, primeiro o que é esse VBA? E por que parece ser controverso aprender VBA?

O famoso VBA é uma linguagem de programação incluído no Microsoft Office com o objetivo de automatizar processos e fluxos dentro desses programas, ou ainda, interagir com o mundo além do Office (conversaremos sobre isso depois!). Dentro do nosso contexto aqui, foi possível criar soluções para o Microsoft Excel com automação em planilhas, criar telas front-end (interface que o usuário possa interagir), tratamento de dados e por aí vai.

Foi criado em 1993 então neste ano comemoramos os 30 anos de VBA! Hooray!

E apesar de outras linguagens de programação continuarem relevantes (Javascript hoje tem 28 anos), a discussão sobre VBA ser obsoleto ou não já vem acontecendo há um tempo. Dentro do Office já existem diferentes soluções usando Add-ins e está chegando o Python para Excel. Quando li recentemente o texto 5 razões para aprender programação em VBA em 2022 (inglês), decidi que precisava escrever sobre o assunto para contribuir na narrativa.

Vamos lá: lista de 10 coisas que aprendi com o VBA!

1. Programação (e em modo escuro) Meio óbvio, mas é verdade!

Apesar de já estar habituado com lógica de programação e estudando tecnologias web, devido ao novo trabalho ser propício para desenvolvimento em VBA, foi uma motivação para conseguir contribuir e finalizar projetos que não são somente exercícios ou estudos.

O VBA é escrito como linguagem procedural por meio de subrotinas e funções, e também dá suporte a orientação a objetos, ao acessar objetos, propriedades e métodos de elementos do próprio Office, mas também podemos criar nossas próprias classes. Em 2023, ainda não estou habitado a criar módulos de classes, mas ao criar diferentes módulos e acessá-los a partir de outros de forma parametrizada já trás uma sensação de grande liberdade.

A tela do editor é nada amigável e não possui modo escuro:

Tela padrão do VBA, com um Olá Mundo!
A tela padrão do VBA com a fonte Courier New e um tema que dá dor na vista em 15 minutos de programação.

Eu lidei com isso alterando a fonte e as cores (super limitadas) que o VBA já proporciona. Mas é possível acessar diretamente a DLL do VBA com programas de terceiros que permitem uma liberdade ainda maior. Mas já estou super satisfeito com minha nova tela:

Tela padrão do VBA, agora com fundo escuro.
Usando Consolas e um fundo escuro já melhorou muito! E com esse toque de branco e cinza nas letras já ficou chique demais. E ainda acessando a DLL daria para ficar ainda mais estilizado, mas acabei me acostumando assim.

Um novo grande amor: Dicionários

Além do fato que “cara, programar em VBA é estranho“, pra variar ele tem algumas várias particularidades. E uma delas que vale a pena mencionar é a forma que lida com matrizes (arrays). Por padrão, nós podemos criar uma String() desta forma para armazenar uma matriz, porém, exigirá ficar moldando o tamanho dessa matriz sempre que ela for alterada.

Alguma alma muito bondosa pensou em incluir o Dictionary no VBA. Para começar a utilizar, basta ativar a Referência Microsoft Scripting Runtime. O Dicionário permite criar uma matriz de N linhas e de duas colunas — Key e Item, e ambas podem ser acessadas. Cada Key é única, e o Item pode conter qualquer coisa: uma String, um Número, uma Função, ou até outro Dicionário.

Além disso, o Dicionário tem alguns métodos bem legais como o .Exists, que permite verificar se tal Key existe dentro desse dicionário.

Uma demonstração simples de adicionar dados no Dicionário em VBA.
Uma demonstração simples de adicionar dados no Dicionário. Não precisamos declarar quantas linhas o dicionário terá, mas as Keys e Items são de preenchimento obrigatório. Isso permite outras abordagens, como realizar um “de para” ou que o Item seja uma característica da Key como o caso acima. A verificação imediata é o console do VBA.

2. Princípio da responsabilidade única

Em meus primeiros passos de VBA, meu mentor (e também meu especialista favorito) já me ensinava a programar com a filosofia da responsabilidade única. A princípio, dava a impressão que estávamos criando muitas Subs (subrotinas) curtíssimas, às vezes com uma única linha, ou três, mas que era uma das melhores práticas com impacto direto no código e na manutenção dele a longo prazo.

Demonstração de dividir responsabilidades nas Subs do VBA.
Parece que o código ficou maior, mas agora está muito mais organizado! Existe uma Sub principal chamada “sExibirNotasAlunos” que é pública e acessa as Subs privadas ao módulo, que são as de Carregar e outra de Exibir.

Além disso, com esta prática, me deu impressão que tornou mais fácil refatorar o código. Se a sub está fazendo mais de uma funcionalidade, já é um sinal que posso melhorar o código. Ou o oposto: se tem duas subs/funções fazendo a mesma coisa mas só muda um detalhe, por que não parametrizar e tornar uma só?

Outra grande vantagem é na correção ou melhoria de uma característica específica do código, normalmente podemos editar somente a funcionalidade específica. Dessa forma podemos ir diretamente na sub/função que faz determinada tarefa e fazer o que tem que ser feito, normalmente sem impactar outras tarefas.

3. Clean code (código limpo) e convenções de nomenclaturas

Quando escrevemos um código, queremos ao máximo que o outro programador possa entender o que estamos fazendo, e por isso podemos inserir comentários, que são textos que não impactam o código, mas que são observações ou explicações sobre alguma funcionalidade.

Entendo que a filosofia maior do clean code (código limpo) é dispensar o uso dos comentários. Ou seja, os nomes falam por si só o que estão fazendo e você não precisa necessariamente analisar linha a linha se você só quer saber a etapa do código.

No exemplo anterior, está bem claro que uma sub está responsável por carregar os dados dos alunos, e outro para exibir, certo? Eu não preciso escrever comentários para dizer que “esta Sub carrega os dados dos alunos”. O próprio nome dela já explica.

Não acompanho a comunidade VBA ainda, mas diferente de outras comunidades como o Python que possui seu PEP 8, ouço dizer que cada um tem o seu estilo de escrita e organização, e por isso, nós adotamos uma convenção para o setor. 

Continuação do exemplo anterior de VBA, com uma nova função no meio do código.
O código agora tem uma função que verifica se o aluno passou de ano, em tempo de execução do código. Dentro da repetição para cada chave (key) existente, ele verifica se o aluno está aprovado. A gente não precisa saber o que está dentro da função para saber que ele vai verificar se o aluno passou de ano. (E talvez possamos chamar essa função em outra sub?)

Repare também que as Subs começam com s, e as Funções com f. Além disso, usamos a escrita camelCase, que foi inclusive uma mudança em 2023 para adaptar ao comportamento de outra parte do VBA.

Além disso, declaramos as variáveis quando elas são utilizadas ao invés de fazer uma lista no topo:

Exemplo de declaração de variável no VBA.
Mesmo em um código mais longo/complexo, nossa convenção é buscar escrever a declaração da variável logo antes que ela será utilizada.

4. Consequentemente, trabalhar em equipe

A partir destes dois aprendizados anteriores, tornam o trabalho em equipe muito viável: podemos ler os códigos dos outros com extrema facilidade e ter formas muito próximas de escrita e abordagem. Além disso, por meio das convenções podemos melhorar o código de outro autor sem parecer que foi um trabalho de duas pessoas. Agora, podemos “assinar como um setor”.

Essas vantagens ficam ainda mais evidentes, quando visitamos algumas soluções antigas que não possuem nada disso: ficamos mais tempo tentando entender o que cada parte do código faz do que de fato realizando as melhorias devidas.

Feedback do Mentor
Meu mentor leu rapidamente o código no WhatsApp, e convenção e encontrou uma melhoria na hora, graças ao clean code e as convenções que adotamos. Posso emoldurar esse “está top demais, parabéns”?

5. Validar tudo o que é possível

Temos que garantir que o código funcionará conforme queremos, e para isso, precisamos validar tudo o que for possível! Desde a entrada do código, verificar os tipos… E isso fica ainda mais maluco quando o usuário não é o programador, e sim alguém da ponta!

Na solução que avaliamos agora pouco das notas dos alunos, existem possíveis pontos que o código poderia bugar ou não estar de acordo com as regras de negócio:

  • O que garante que o campo do nome do aluno não esteja em branco?
  • E se a nota não fosse um número, mas talvez uma String (Texto)?
  • E se a nota inserida estivesse abaixo de 0? Ou acima de 10?

É possível criar validações para cada tipo de imprevisto, que agora não são mais imprevistos porque estamos prevendo, e desta maneira subir erros adequados para que o usuário saiba o que deu de errado. Podemos criar usando algumas condições e criando textos personalizados de erros.

Tratamento de Erros no VBA
Agora minha Sub principal possui um tratamento de erros, e as validações são realizadas nos módulo Validador. Desta forma, também aplicamos responsabilidade única para os módulos, e fica mais organizado! Reparou também que os nomes dos módulos começam com “m”? Assim, tanto na organização dos módulos e também no código fica claro o que está acontecendo.

6. Pensar na escalabilidade e reutilização

E se...?

É seguro afirmar que todo código tem potencial para se tornar algo melhorado no futuro. Seja por refatoramento, que é melhorar o código que já existe; ou ainda para acrescentar novas funcionalidades. Não é incomum entregarmos uma demanda e algumas semanas depois recebermos um “muito bom isso aqui, mas será que podemos fazer aquilo também?

E aí que mora o perigo. Se não escrevemos nosso código de modo que seja flexível e escalável, praticamente teríamos que reescrever o código, ou ainda, na pressa, fazer um trabalho muito esquisito (para não dizer “migué”) e tornar ainda mais delicada a manutenção dele.

Ou seja, aplicando as boas práticas mencionadas até agora já permite que a gente consiga fazer alterações pontuais somente nos detalhes necessários ou somente incluir novas Subs dentro da Sub Principal. Vale a pena destacar que escrita do código em si (lógica) também é muito importante.

"Bem que poderia usar a mesma solução de outro projeto nisso aqui..."

E quando a gente já tem uma solução pronta e poderíamos reutilizar a mesma lógica em uma nova solução?

Será que se fizermos um copypaste e ajustar somente alguns trechos torna possível a reutilização do código? Se sim, maravilha! Para mim, foi uma das minhas maiores conquistas.

No começo do aprendizado, eu estava engajado em uma solução universal de “importador de dados”, porém só consegui utilizar uma ou duas vezes para soluções super específicas, talvez ainda por apego, e aí entrou em desuso.

Meses depois, consegui desenvolver um importador melhor (fiquei muito emocionado em vê-lo funcionando) e, utilizando um pouco do padrão Factory Method, foi possível reutilizá-lo em uma solução diferente que tinha uma mesma lógica de importação. Como o código já estava bem flexível, só precisei alterar algumas nomenclaturas (sinal de possível melhoria no código!) e configurar novos padrões de relatórios a serem importados, porém, o código de importação ficou praticamente intacto, e permitiu que colocasse novas funcionalidades.

Copiar módulo de VBA
Uma das facilidades é copiar o módulo inteiro de um arquivo para outro. A interface do VBA permite abrir códigos de outras aplicações que estão abertas, neste caso, duas pastas (workbook) Excel.

7. Trabalhar em conjunto com outras soluções do Office

Userform de progresso
Tela de progresso do Exportador de dados Excel para Access

Além do horizonte...

Recentemente fiz um projetinho de importador de dados, como comentei no aprendizado anterior. Essa ferramenta, não somente importa dados para o Excel, como também exporta dados para o Access!

Ou seja, é possível manipular inter-programas utilizando o VBA, seja por bibliotecas (referências) nativas ou utilizando de terceiros.

Pude também criar um projeto bem simples porém muito interessante, relacionado a cobrança de inadimplentes por WhatsApp. Como ele funciona:

  1. Importador de dados que o sistema da empresa exporta em .xls com a lista dos clientes com alguns status como, nome, data de vencimento da fatura, valor em atraso, número de telefone celular;
  2. Realizar os devidos tratamentos do arquivo gerado;
  3. Gerar lista dos inadimplentes de acordo com os critérios definidos pela organização. (Validação!);
  4. Criar uma coluna da lista com o link do WhatsApp Web (desktop) que leva ao contato e a mensagem com os dados do cliente, para que então o usuário apenas possa enviar a mensagem pronta!

Muito legal, né? Em um momento futuro falarei mais sobre essa ferramenta!

Tela da Ferramenta que gera lista de inadimplentes
Tela da ferramenta de clientes inadimplentes, o status traz a validação dos clientes, e para clientes válidos, gera um link único que leva ao contato especificado já com o texto carregado.

VBA é um dos três mosqueteiros

O Excel possui também outras duas grandes ferramentas poderíssimas: Power Query e Power Pivot.

Em um super resumo, o Power Query está relacionado ao tratamento de dados enquanto o Power Pivot ao criar indicadores com os dados carregados.

Apesar do VBA também poder realizar tratamentos de dados, como importar um arquivo excel e escrever uma série de sub-rotinas para que seja realizados devidos tratamentos, temos que avaliar quando fazer isso pelo VBA e quando fazer isso pelo Power Query. Para mim, a principal razão em preferir usar o Power Query sempre quando possível é pela praticidade e intuitividade que oferece. Além disso, é mais amigável aos iniciantes e tenho certeza que meus futuros mentorados (se o universo permitir) poderão entrar de cabeça no setor de forma mais didática por meio do Power Query e depois desbravar o VBA.

Enquanto o VBA tem condições (talvez precárias) em lidar com Modelo de Dados, o Power Pivot (DAX) já faz o serviço de forma bem direcionada.

Essas duas ferramentas do Excel são amplamente exploradas nas comunidades de inteligência de dados e normalmente direcionadas para Power BI, porém, são super aplicáveis e relevantes para o Excel.

Mas e se a gente quiser gerar relatórios automatizados a partir de dados carregados no Power Query e indicadores criados em expressões DAX no Power Pivot? O VBA poderá tornar isso possível!

Ou seja, se ficarmos bem entendidos com VBA, Power Query e Power Pivot, podemos dizer que pelo menos o nosso personagem não está mais nas primeiras fases do jogo. Podemos arriscar em dizer que esse é o tal do Excel Avançado. Porém, é um assunto para outro texto que merece muito mais do que alguns parágrafos.

8. Ribbons (botões)

A execução do código VBA não está restrito somente à interface do editor. Podemos chamar os códigos ou macros por meio de formas, ou ainda de forma mais elegante, criando um menu no próprio Office.

Os Ribbons do Office permite que criemos um menu personalizado e que cada botão chame uma sub específica do botão. Desta forma, o usuário não precisa acessar o editor e ter que adivinhar qual código rodar primeiro. Inclusive, o botão pode determinar o comportamento do código, ao carregar algum dado que especifique o tipo do botão.

Tela da Ferramenta que gera lista de inadimplentes
Na mesma interface do Excel onde estão as principais ferramentas, podemos criar mais uma aba com um nome personalizado e com botões personalizados. O Office tem uma lista nativa de ícones mas também é possível subir ícones próprios.

Para editar os Ribbons do Excel, é por meio do arquivo customUI.xml que está localizado dentro do arquivo. Para isso poderá usar um editor como por exemplo o Office RibbonX Editor, ou abrir o arquivo como .zip e criar/editar o XML.

E isso dá uma cara muito mais profissional para as soluções, não é? Nos ribbons, podemos criar menu suspenso, caixa de seleção, outras separações e mais.

9. Formulários do VBA (UserForms)

Não menos importante, mas uma outra característica muito interessante do VBA, é que é possível criar telas front-end, ou seja, interface gráfica para que o usuário possa interagir com uma determinada parte do código, ou apenas ver uma tela de “Aguarde” enquanto o código é executado. Isso é muito útil na criação de sistemas.

Confesso que um desafio muito grande, principalmente para nós designers, é superar o visual padrão do VBA. É possível criar uma tela de login muito simples com um visual bem… anos 2000, como também é possível carregar nossas próprias imagens e criar um visual moderno. Como você viu na minha tela de “aguarde”, ele já não está totalmente padrão do VBA mas ainda longe de ser uma tela moderna.

O lance é também conseguir realizar essas modificações visuais de forma otimizada, não somente falando de código ou configuração, mas também de tempo. Em muitos casos, pode ser que a funcionalidade seja muito mais importante que uma tela bonita. Portanto, vale a pena entender as prioridades do projeto antes de investir muito tempo nele.

De qualquer maneira, existem grupos e profissionais sérios que criam userforms lindíssimos que nem dão margem para achar que é VBA, e isso me cativa a querer fazer mais coisas!

Tela Dev Nascimento
Olha essa tela de cadastro criado pelo Dev Nascimento, que lindeza! (Não é afiliação hehe)

10. Além da programação: documentação

Além de somente desenvolver ferramentas com VBA, é importante que essas ferramentas estejam bem escritas conforme tudo o que vimos até agora. Mas também, que sejam explicadas fora da ferramenta.

Cada organização possui sua forma de documentar esses processos e fluxos. Uma abordagem interessante seria criar um documento (algo como Word ou Google Documentos) com:

  • Explicação sobre o objetivo da ferramenta e as condições para utilizar;
  • Validações realizadas;
  • Pontos de atenção no código (às vezes não foi possível escrever da melhor maneira possível, então uma explicação extra é merecida);
  • E também o seu procedimento, caso seja uma ferramenta de uso contínuo (ex: tratamento mensal de dados), de forma que alguém que esteja somente interessado em rodar o programa possa realizar o processo corretamente mesmo sem entender programação.

E além disso, se a ferramenta faz parte de projeto maior, que tal incluí-lo em um fluxograma? Assim, outros colegas poderão entender em que parte do projeto a ferramenta se encaixa, e quais as dependências desse projeto e para onde ele leva, de modo que fique claro o percurso e as características de cada elemento:

Tela da Ferramenta que gera lista de inadimplentes
Projeto de documentação: mapeamento das ferramentas utilizando diagramas.

11. Ainda há muito mais o que explorar! Os próximos passos para me tornar o rei do vba! (brincadeira)

E o que mais explorar?

Termino meu ano de 2023 com uma noção muito interessante em programação procedural, com umas pitadas a programação orientada a objetos. Em todas as soluções trabalhadas até agora acredito que consegui lidar bem com as abordagens e sempre consultando meu mentor para buscar as melhores práticas.

Existem soluções ainda mais avançadas e malucas escritas em VBA que quero conseguir compreender, principalmente entender melhor os módulos de classes.

Além disso, aprender Python está como uma prioridades de 2024. Acredito que será um estudo muito interessante para essa área de automação e análise dados. São dados para os próximos capítulos!

Considerações finais

Ao escrever esse texto, percebi a importância em registrar o progresso nesse aprendizado. E de alguma forma, que seja um material de consulta e que possa ajudar a outras pessoas se encontrarem de alguma maneira. 

Gostaria de reforçar minha gratidão à equipe de Inteligência de Dados que faço parte, são amigos que buscam a excelência e transparência em tudo o que fazem, valores que me impactam demais. Não sei o que seria o meu 2023 sem esta nova família.

Feliz ano novo!