Blog

Postado em em 7 de maio de 2022

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!

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?

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:

Option Explicit

Public nome As String
Public email As String
Public dataNasc As Date
Public area As String
Public dataContra As Date
Public cpf As LongLong
Public salIni As Double
Public salAtual As Double


Public Function calcIdade() As Long

    Dim idade As Long

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

    MsgBox ("O funcionário " & nome & " tem " & idade & " anos.")

End Function

 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”
Public Function calcTempoContrat() As Long

    Dim diasContrat As Long

    diasContrat = Date - dataContra

    MsgBox ("O funcionário " & nome & " foi contratado há " & diasContrat & " dias.")

End Function

 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”
 Public Function alterarArea(novaArea As String)

    Dim areaAntiga As String

   areaAntiga = area
  area = novaArea
   Cells(2, 4).Value = area

    MsgBox ("O funcionario " & nome & " mudou da área '" & areaAntiga & "' para a área '" & area & "'.")

End Function

 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”
Public Function aumentoSalario(aumentoPerc As Double)

    Dim novoSalario As Double

    novoSalario = Round(salAtual * (1 + aumentoPerc), 0)

    salAtual = novoSalario
   Cells(2, 8).Value = salAtual

    MsgBox ("O novo salário do funcionario " & nome & " é de " & Format(salAtual, "R$ #,##0.00"))

End Function

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:

Option Explicit

Sub macroClasses()

Dim funcionario As New classeFuncionario

funcionario.nome = Cells(2, 1).Value
funcionario.email = Cells(2, 2).Value
funcionario.dataNasc = Cells(2, 3).Value
funcionario.area = Cells(2, 4).Value
funcionario.dataContra = Cells(2, 5).Value
funcionario.cpf = Cells(2, 6).Value
funcionario.salIni = Cells(2, 7).Value
funcionario.salAtual = Cells(2, 8).Value

funcionario.calcIdade
funcionario.calcTempoContrat
funcionario.alterarArea "Financeiro"
funcionario.aumentoSalario 0.15

End Sub

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

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 Gratuito?


Vire uma referência no Mercado de Trabalho por causa do Power BI!

Quer saber como? Inscreva-se no Intensivão de Power BI! É gratuito!