Módulos de Classe no VBA – Saiba Como Utilizá-los

Você já conhece os módulos de classe no VBA? Hoje eu quero te mostrar uma introdução a esses módulos para organizar seus códigos.

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!

O que você aprende neste vídeo

Resposta rápida: Um módulo de classe no VBA cria o seu próprio objeto: você declara as propriedades como variáveis Public e os métodos como funções dentro dele, e passa a usar tudo pelo ponto, como em um Range. A classe se exporta em um arquivo e viaja para outras planilhas. Para automação pequena não compensa: a estrutura custa mais que o script.

Neste vídeo (30 min):

  • 1:00 - As sete propriedades do funcionário que servem de exemplo em toda a aula.
  • 2:00 - A vantagem principal: criar objetos próprios, com propriedades e métodos, como um Range ou um Workbook.
  • 5:00 - Quando não compensa usar classe: automação pequena não paga o custo da estrutura.
  • 6:00 - Criar a classe em Inserir, Módulo de Classe, e dar nome a ela na janela de propriedades.
  • 7:00 - Declarar as propriedades como variáveis Public dentro da classe.
  • 9:00 - No módulo comum, declarar a variável com New para já alocar o objeto na memória.
  • 10:00 - O autocompletar passa a listar as propriedades da classe como em um objeto nativo.
  • 12:00 - Criar a primeira função dentro da classe, para calcular a idade a partir da data de nascimento.
  • 14:00 - Usar WorksheetFunction para chamar uma função do Excel de dentro do VBA.
  • 15:00 - Chamar a função pelo objeto, com o mesmo ponto que dá acesso às propriedades.
  • 18:00 - Função que recebe argumento: alterar a área do funcionário passando a área nova.
  • 21:00 - Função de aumento salarial: o salário atual multiplicado por um mais o percentual.
  • 24:00 - Usar Format para exibir o valor como moeda na caixa de mensagem.
  • 28:00 - Exportar a classe em arquivo e importá-la em outra planilha, levando propriedades e funções junto.

Trechos do vídeo:

  • Guardar a área antiga em uma variável antes de sobrescrever a propriedade é o que permite a mensagem mostrar de onde para onde o funcionário mudou.
  • O código de formatação usado no Format sai de Formatar Células, opção Personalizado, mas o VBA espera o separador no padrão dele, não no do Excel em português.

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Fala, Impressionadores! Hoje eu vou mostrar uma introdução a módulos de classe no VBA que vocês pediram!

Esse é um tema muito interessante, pois os módulos de classe no VBA vão deixar o seu código mais organizado e mais fácil de ser lido.

Então mesmo que você não tenha escrito o código você vai notar que é muito mais fácil entender o que foi feito.

A ideia é te mostrar como usar classes no VBA, como fazer a organização do código com classes e como importar classes no VBA.

Sim, é possível importar classes para facilitar o seu trabalho sem que você tenha que refazer tudo que já fez.

Pode simplesmente arrastar a classe que você exportou para dentro do VBA e pronto, já pode utilizá-las!

E aí, bora aprender o que são classes no VBA e como elas podem te auxiliar na sua programação?

Um módulo de classe no VBA é onde você cria um objeto próprio, com propriedades declaradas como Public nome As String e métodos escritos como Public Function. Em um módulo comum, você declara Dim funcionario As New classeFuncionario e passa a usar funcionario.nome ou funcionario.calcIdade, com o código bem mais organizado.

Inserindo um Módulo de Classe no VBA

Para criar um código dentro de um módulo, precisamos primeiramente abrir o ambiente de VBA, a partir do atalho do teclado Alt(+Fn)+F11.

Como não temos nenhum módulo de classe destinado ao tema da aula de hoje, e por questão de organização, vamos criar um módulo de classe à parte.

Vamos na guia Inserir > Módulo de classe, e uma caixa branca se abrirá.

Como usar classes no VBA
Como usar classes no VBA

Por padrão ele terá o nome de “Classe 1”.

Colocaremos os seguintes códigos (subs e functions) dentro dele:

VBA
<strong>Option Explicit</strong>

<strong>Public nome As String</strong>
<strong>Public email As String</strong>
<strong>Public dataNasc As Date</strong>
<strong>Public area As String</strong>
<strong>Public dataContra As Date</strong>
<strong>Public cpf As LongLong</strong>
<strong>Public salIni As Double</strong>
<strong>Public salAtual As Double</strong>

<strong>Public Function calcIdade() As Long</strong>

<strong>    Dim idade As Long</strong>

<strong>    idade = WorksheetFunction.RoundDown((Date - dataNasc) / 365, 0)</strong>

<strong>    MsgBox ("O funcionário " & nome & " tem " & idade & " anos.")</strong>

<strong>End Function</strong>

 Explicação do código acima:

  • Vamos dimensionar:
    • as variáveis “nome”, “email”, “área” como sendo do tipo String (texto)
    • as variáveis “dataNasc”, “dataContra” como sendo do tipo Date (data)
    • as variáveis “salIni” e “salAtual” com sendo do tipo Double (número com casa decimal)
    • a variável “cpf” como sendo do tipo LongLong (número muito grande)
    • Para entender melhor sobre os tipos de dados no VBA, visite esse link oficial
  • Declarar uma função pública chamada “calcIdade”, que não terá nenhum argumento, com resposta dada como um número do tipo Long (número grande)
  • Dentro dessa function, vamos executar os seguintes passos:
    • Declarar a variável “idade” como um número do tipo Long
    • A variável “idade” vai receber o que for resultado da fórmula que vai arredondar para baixo a conta que vai gerar a sua idade em número inteiro (sem vírgulas)
    • Gerar uma MsgBox que vai dizer idade do funcionário, apontados respectivamente pelas variáveis “idade” e “nome”
    Ícone VBAVBA Impressionador

    Como automatizar praticamente qualquer tarefa repetitiva que você faça dentro do Excel. Aprenda a criar integrações do Excel com o PowerPoint, Word, Outlook e muito mais. Aprenda a criar automações para resolver tudo com apenas um clique em um botão. Tudo isso com uma única linguagem que junta todos esses programas.

    Começar agoraSeta para a direita
    Fundo VBATelas VBA
VBA
<strong>Public Function calcTempoContrat() As Long</strong><br><br><strong>    Dim diasContrat As Long</strong><br><br><strong>    diasContrat = Date - dataContra</strong><br><br><strong>    MsgBox ("O funcionário " & nome & " foi contratado há " & diasContrat & " dias.")</strong><br><br><strong>End Function</strong>

 Explicação do código acima:

  • Declarar uma função pública chamada “calcTempoContrat”, que não terá nenhum argumento, com resposta dada como um número do tipo Long (número grande)
  • Dentro dessa function, vamos executar os seguintes passos:
    • Declarar a variável “diasContrat” como um número do tipo Long
    • A variável “diasContrat” vai receber o que for resultado da fórmula que vai fazer a subtração entre a data atual (dada pela função Date) e a a variável “dataContra”, que é uma variável conhecida do módulo de classe
    • Gerar uma MsgBox que vai dizer o nome do funcionário e há quantos dias está contratado, apontados respectivamente pelas variáveis “nome” e “diasContrat”
VBA
<strong> </strong><strong>Public Function alterarArea(novaArea As String)</strong><br><br><strong>    Dim areaAntiga As String</strong><br><br> <strong>   areaAntiga = area</strong><br><strong>    area = novaArea</strong><br><strong>    Cells(2, 4).Value = area</strong><br><br><strong>    MsgBox ("O funcionario " & nome & " mudou da área '" & areaAntiga & "' para a área '" & area & "'.")</strong><br><br><strong>End Function</strong>

 Explicação do código acima:

  • Declarar uma função pública chamada “alterarArea”, que terá a variável “novaArea” como argumento, que será uma variável do tipo String (texto)
  • Dentro dessa function, vamos executar os seguintes passos:
    • Declarar a variável “areaAntiga” como sendo do tipo String (texto)
    • A variável “areaAntiga” vai receber o que estiver na variável área (que já é uma variável conhecida do módulo de classe)
    • A variável conhecida do módulo de classe “area” vai receber o valor da variável que foi passada pela function, a “novaArea”
    • A célula da 2ª linha, da 4ª coluna (célula D2) vai receber o valor que estiver na variável “area”
    • Gerar uma MsgBox que vai dizer o nome do funcionário, a área antiga e a área nova, apontados respectivamente pelas variáveis “nome”, “areaAntiga” e “area”
VBA
<strong>Public Function aumentoSalario(aumentoPerc As Double)</strong><br><br><strong>    Dim novoSalario As Double</strong><br><br><strong>    novoSalario = Round(salAtual * (1 + aumentoPerc), 0)</strong><br><br><strong>    salAtual = novoSalario</strong><br><strong>    Cells(2, 8).Value = salAtual</strong><br><br><strong>    MsgBox ("O novo salário do funcionario " & nome & " é de " & Format(salAtual, "R$ #,##0.00"))</strong><br><br><strong>End Function</strong>

Explicação do código acima:

  • Declarar uma função pública chamada “aumentoSalario”, que terá a variável “aumentoPerc” como argumento, que será uma variável do tipo Double (possibilidade de número decimal, com vírgula)
  • Dentro dessa function, vamos executar os seguintes passos:
    • Declarar a variável “novoSalario” como sendo do tipo Double
    • A variável “novoSalario” vai receber o que for resultante do arredondamento com 0 casas da multiplicação da variável “salAtual” (que já é uma variável conhecida do módulo de classe) por (1+ aumentoPerc).
    • A variável “salAtual” vai receber o valor da variável “novoSalario”, calculada anteriormente
    • A célula da linha 2 e coluna 8 vai receber o valor da variável “salAtual”, depois do cálculo
    • Gerar uma MsgBox que vai dizer o nome do funcionário e o novo salário, apontados respectivamente pelas variáveis “nome” e “salAtual”, formatada para moeda

Inserindo um Módulo no VBA

Para criar um código dentro de um módulo, precisamos primeiramente abrir o ambiente de VBA, a partir do atalho do teclado Alt(+Fn)+F11.

Como não temos nenhum módulo destinado ao tema da aula de hoje, e por questão de organização, vamos criar um módulo à parte.

Vamos na guia Inserir > Módulo, e uma caixa branca se abrirá.

Módulos de Classe no VBA

Por padrão ele terá o nome de “Módulo 1”.

Colocaremos a seguinte sub dentro dele:

VBA
<strong>Option Explicit</strong><br><br><strong>Sub macroClasses()</strong><br><br><strong>Dim funcionario As New classeFuncionario</strong><br><br><strong>funcionario.nome = Cells(2, 1).Value</strong><br><strong>funcionario.email = Cells(2, 2).Value</strong><br><strong>funcionario.dataNasc = Cells(2, 3).Value</strong><br><strong>funcionario.area = Cells(2, 4).Value</strong><br><strong>funcionario.dataContra = Cells(2, 5).Value</strong><br><strong>funcionario.cpf = Cells(2, 6).Value</strong><br><strong>funcionario.salIni = Cells(2, 7).Value</strong><br><strong>funcionario.salAtual = Cells(2, 8).Value</strong><br><br><strong>funcionario.calcIdade</strong><br><strong>funcionario.calcTempoContrat</strong><br><strong>funcionario.alterarArea "Financeiro"</strong><br><strong>funcionario.aumentoSalario 0.15</strong><br><br><strong>End Sub</strong>

Explicação do código acima:

  • A primeira linha diz que que todas as variáveis utilizadas no código serão obrigatoriamente declaradas. Observe que isso é algo que é colocado fora da estrutura das nossas subs (vem antes do começo da Sub, de fato)
  • Vamos dimensionar:
    • A variável “funcionario” como um novo objeto da “classeFuncionario”, assumindo assim todas as propriedades e métodos (funções) criadas dentro dela
  • A propriedade “nome” do objeto “funcionario” vai receber o valor que estiver na célula da 2ª linha e 1ª coluna
  • A propriedade “email” do objeto “funcionario” vai receber o valor que estiver na célula da 2ª linha e 2ª coluna
  • A propriedade “dataNasc” do objeto “funcionario” vai receber o valor que estiver na célula da 2ª linha e 3ª coluna
  • A propriedade “area” do objeto “funcionario” vai receber o valor que estiver na célula da 2ª linha e 4ª coluna
  • A propriedade “dataContra” do objeto “funcionario” vai receber o valor que estiver na célula da 2ª linha e 5ª coluna
  • A propriedade “cpf” do objeto “funcionario” vai receber o valor que estiver na célula da 2ª linha e 6ª coluna
  • A propriedade “salIni” do objeto “funcionario” vai receber o valor que estiver na célula da 2ª linha e 7ª coluna
  • A propriedade “salAtual” do objeto “funcionario” vai receber o valor que estiver na célula da 2ª linha e 8ª coluna
  • Vamos utilizar do método/função “calcIdade” do objeto “funcionario”, que foi a function criada e explicada anteriormente
  • Vamos utilizar do método/função “calcTempoContrat” do objeto “funcionario”, que foi a function criada e explicada anteriormente
  • Vamos utilizar do método/função “alterarArea” do objeto “funcionario”, que foi a function criada e explicada anteriormente, passando para ela o argumento “Financeiro”, que assumirá o valor da variável “novaArea” da função
  • Vamos utilizar do método/função “aumentoSalario” do objeto “funcionario”, que foi a function criada e explicada anteriormente, passando para ela o argumento “Financeiro”, que assumirá o valor da variável “aumentoPerc” da função

No começo do código temos o seguinte cenário:

Módulos de Classe no VBA

Ao final do código, teremos os valores pesquisados mostrados nas MsgBox, e no Excel:

Módulos de Classe no VBA

Perguntas frequentes

1. Como criar um módulo de classe no VBA?

Abra o editor com Alt+F11, vá em Inserir, Módulo de classe, e uma janela em branco aparece com o nome padrão Classe1. Renomeie a classe para algo descritivo, como classeFuncionario, e escreva dentro dela as propriedades públicas e as funções que o objeto vai oferecer.

2. Qual a diferença entre módulo e módulo de classe no VBA?

O módulo comum guarda as macros que você executa, as subs e funções do dia a dia. O módulo de classe define um modelo de objeto: quais informações ele armazena, nas propriedades, e o que ele sabe fazer, nos métodos. O módulo comum cria o objeto a partir desse modelo e o utiliza.

3. Como usar as propriedades e funções de uma classe em uma macro?

Declare o objeto com Dim funcionario As New classeFuncionario. Depois preencha as propriedades, como funcionario.nome = Cells(2, 1).Value, e chame os métodos escrevendo funcionario.calcIdade ou funcionario.aumentoSalario 0.15. O ponto após o nome do objeto lista tudo o que a classe disponibiliza.

4. Como reaproveitar uma classe em outra planilha?

Clique com o botão direito sobre a classe no Project Explorer e escolha exportar arquivo, gerando um arquivo .cls. Em outro projeto, importe esse arquivo ou arraste-o para dentro do editor do VBA. A classe fica disponível na hora, sem precisar reescrever propriedades e funções.

Conclusão dos Módulos de Classe no VBA

Nessa aula você lidou com os seguintes conceitos:

  • Tipos de dados no VBA
  • Como usar classes no VBA
  • Organização de código em VBA com classes
  • Criar objetos no VBA

Até o próximo post! Fique ligado no nosso canal do Youtube para mais conteúdo de VBA toda semana! Valeu, Impressionadores!

Hashtag Treinamentos

Para acessar outras publicações de VBA, clique aqui!


Quer aprender mais sobre VBA com um minicurso básico gratuito?