Retornar aos Exemplos de Códigos VBA

VBA – Tutorial e Exemplos de Módulo de Classe

Este tutorial o ensinará sobre os módulos de classe no VBA. Você aprenderá o que eles são e como usá-los.

Módulos de Classe do VBA – Introdução

Quando você insere módulos no Visual Basic Editor (VBE) para inserir seu código, talvez tenha notado que também pode inserir o que é chamado de “Módulo de classe”.

inserir modulo classe

Módulos de Classe vs. Módulos

Os módulos de classe funcionam de maneira muito diferente dos módulos comuns, pois facilitam a criação de um Component Object Model (COM) que pode ser usado em seu código VBA normal.

Na verdade, você cria um objeto que funciona da mesma forma que um objeto incorporado do Excel, como “Planilhas”. No objeto Worksheets, você tem várias propriedades e métodos que lhe permitem obter o número de planilhas em uma pasta de trabalho ou cada nome individual de uma planilha, ou várias outras informações

Ao criar um novo objeto dessa forma, você está criando um bloco de construção que pode ser usado em qualquer lugar no VBA. O objeto tem várias propriedades e métodos que podem ser acessados pelo seu código VBA de qualquer lugar da pasta de trabalho, sem a necessidade de reescrever o código novamente.

Além de fazer referência ao novo objeto em um módulo VBA padrão, também é possível usá-lo no código por trás de um UserForm que faz parte do seu aplicativo personalizado.

Também pode usá-lo quando tiver colocado controles Active X em uma planilha, como um botão de comando ou um menu suspenso. Todos esses controles usam VBA, e seu novo objeto pode ser facilmente incorporado ao código de evento desses controles.

Você também pode transformar seu objeto em um suplemento do Excel. Seu objeto estará automaticamente disponível para outros usuários que tenham esse suplemento carregado. Isso adiciona sua própria arquitetura de várias camadas ao aplicativo do Excel.

O Excel é um aplicativo de várias camadas. Há a camada de serviços do cliente, que aciona a janela da planilha real com a qual o usuário está familiarizado. O modelo de objeto do Excel é a próxima camada abaixo. Pressione F2 em um módulo VBA e você poderá ver o grande número de objetos e membros desses objetos que são o mecanismo do Excel. Observe que seu novo objeto também será exibido aqui.

Por fim, abaixo de tudo isso, há a camada de serviços de dados que contém todos os dados que você inseriu nas planilhas e células. O Excel acessa esses dados usando o modelo de objeto do Excel.

lista de classes

A criação de um módulo de classe permite que você estenda o módulo de objeto do Excel com seus próprios objetos e membros personalizados.

Este artigo explica como criar uma hierarquia simples de objetos usando módulos de classe.

Vantagens do Uso de Módulos de Classe

  1. Você pode desenvolver um bloco de construção robusto que pode ser usado em qualquer número de aplicativos diferentes do Excel
  2. Uma vez testado exaustivamente, você pode confiar que ele sempre produzirá os resultados corretos da mesma forma que os objetos internos do Excel
  3. Se forem feitas atualizações no código em outras partes do aplicativo, o novo objeto continuará a funcionar da mesma forma
  4. Você pode usar o novo objeto em outros aplicativos do Excel como um add-in
  5. Os objetos podem ser reutilizados em outros aplicativos e ajudam na depuração

Desvantagens do Uso de Módulos de Classe

  1. Eles podem ser difíceis de criar e entender.
  2. As convenções de nomenclatura são muito importantes porque é isso que você verá quando usar o objeto em um módulo normal.
  3. Se você nunca criou um módulo de classe antes, pode ser difícil entendê-lo e há uma curva de aprendizado acentuada
  4. Impossível fazer alterações em tempo de execução – é preciso redefinir o projeto.
  5. Se as propriedades e as variáveis privadas tiverem o mesmo nome, poderão ocorrer loops infinitos, resultando em erros

Inserção de um Módulo de Classe

Selecione Inserir | Módulo de classe no menu do VBE (Visual Basic Editor). O novo módulo de classe será automaticamente chamado de “Classe 1”, mas isso precisa ser alterado imediatamente para o nome que você usará para o seu objeto.

criando classe um

 

Você altera o nome na janela Propriedades, conforme destacado na imagem. Basta digitar o novo nome e ele será alterado na coleção Módulos de Classe.

Se a janela Propriedades não estiver visível, selecione Exibir| Janela Propriedades no menu VBE ou pressione F4.

Chame seu novo módulo de classe de ‘MyItem’ e clique duas vezes no nome na visualização em árvore no Project Explorer para exibir a janela de código para ele.

Criação de um Item de Objeto

Este exemplo criará um objeto de nível superior chamado “MyItems” com um objeto membro abaixo dele chamado “MyItem”, que conterá os dados individuais de cada item. Uma vez criado, ele funcionará da mesma forma que um objeto do Excel incorporado. Por exemplo, há um objeto chamado “Worksheets” que é uma coleção de cada planilha em sua pasta de trabalho. Há também um objeto chamado “Sheet”, que representa cada planilha individual da pasta de trabalho e contém todas as propriedades e métodos de cada planilha. Esse objeto está relacionado ao objeto de coleção “Worksheets”.

Você pode iterar pela coleção “Worksheets”, visualizando cada “Sheet” por vez. Da mesma forma, você poderá iterar pela coleção “MyItems”, visualizando as propriedades que criou no membro “Myitem”.

A primeira coisa a fazer é criar o subobjeto para o nível de membro que manterá os itens reais dentro da coleção do objeto de nível superior. Isso é o equivalente aos membros (por exemplo, Name, Visible, Count) dentro do objeto “Sheet” no Excel. Esse código é inserido no módulo de classe chamado ‘MyItem’.

Os módulos de classe têm propriedades e métodos. As propriedades são efetivamente como variáveis, pois mantém valores de dados como variáveis, e os métodos são como subrotinas ou funções.

No subobjeto, criaremos duas propriedades para o objeto: Item e Detail

Inicialmente, duas variáveis do tipo string precisam ser declaradas para manter os valores das propriedades:

Private mItem As String
Private mDetail As String

Elas precisam ser declaradas na seção Declarações, na parte superior do código do módulo de classe, para que possam ser usadas em todas as subrotinas do módulo.

Elas precisam receber nomes exclusivos para que sejam diferentes das propriedades que vamos criar, portanto, um “m” (de membro) foi colocado na frente de cada nome.

As variáveis são declaradas como Private para que não possam ser vistas por ninguém que esteja usando o objeto. Elas são variáveis de trabalho para uso no código do objeto e não fazem parte do objeto final.

A próxima etapa é configurar o código para dar acesso às duas propriedades. Isso é feito por meio de uma instrução Property Let e uma Property Get para cada propriedade. Elas devem ser Public, caso contrário o objeto de nível superior não terá nenhuma propriedade visível.

Public Property Let Item(vdata As String)
 mItem = vdata
End Property

Public Property Get Item () As String
 Item = mItem
End Property

Public Property Let Detail (vdata As String)
 mDetail = vdata
End Property

Public Property Get Detail () As String
 Detail = mDetail
End Property

Esse código cria os meios para ler e gravar valores nas duas propriedades (Item e Detail) usando as duas variáveis privadas que foram definidas na seção de declarações do módulo.

O parâmetro ‘vdata’ é usado para passar dados para a propriedade em questão.

É importante que cada propriedade tenha uma instrução ‘Let’ e ‘Get’ e que o nome da propriedade seja o mesmo em cada caso. Você pode acabar com duas propriedades diferentes se a grafia estiver incorreta – uma que pode ser lida e outra que pode ser gravada!

Para ajudar na criação desse código, você pode usar Inserir| Procedimento no menu VBE para criar um esqueleto de código que criará o código inicial para as propriedades ‘Get’ e ‘Let’ para um determinado nome de propriedade.

Isso exibirá uma janela pop-up na qual você digitará o nome da propriedade e selecionará “Propriedade” nos botões de opção:

inserindo myproperty

Clique em “OK” e o código de esqueleto será adicionado ao módulo de classe:

Public Property Get MyProperty() As Variant

End Property

Public Property Let MyProperty(ByVal vNewValue As Variant)

End Property

Isso evita erros nos nomes das propriedades. Basta adicionar seu código entre as instruções ‘Public Property’ e ‘End Property’.

Agora você tem um objeto chamado “MyItem” que conterá todos os dados para este exercício.

Criação de uma Coleção

A próxima etapa é criar um objeto de nível superior como um objeto Collection para dar acesso às propriedades que você definiu no objeto “MyItem”.

Novamente, você precisa definir um objeto de trabalho para atuar como objeto de coleção, da mesma forma que definiu as duas variáveis de string no objeto “MyItem”.

Private mItems As Collection

Novamente, esse objeto precisa ter um nome exclusivo, e é por isso que há um “m” (objeto membro) na frente do nome, e ele também é declarado como “Private” para que não apareça quando o novo objeto estiver sendo usado.

Em seguida, você precisa preencher o código Class_Initialize. Esse código é executado quando você usa o objeto pela primeira vez no código e determina quais valores serão carregados no objeto.

Você pode acessar essa subrotina selecionando “Class” no primeiro menu suspenso e “Initialize” no segundo menu suspenso da janela do módulo.

Private Sub Class_Initialize()
Dim objItem As MyItem
Set mItems = New Collection
For n = 1 To 3
 Set objItem = New MyItem
 objItem.Item = Worksheets("Planilha1").Range("a" & n).Value
 objItem.Detail = Worksheets("Planilha1").Range("b" & n).Value
 mItems.Add objItem
Next n
End Sub

O código configura um objeto chamado ‘objItem’ usando a definição de ‘MyItem’ que criamos como um módulo de classe anteriormente.

Em seguida, ele cria uma nova coleção com base no objeto ‘mItems’ definido anteriormente.

Ele itera pelos valores mantidos na Planilha 1 da pasta de trabalho e os coloca nas propriedades que criamos para o objeto “MyItem”. Observe que quando você usa ‘objItem’, aparece um menu suspenso mostrando as duas propriedades, exatamente como se você estivesse usando um objeto interno do Excel.

O objeto item é então adicionado ao objeto collection, que agora contém todos os dados nos valores de propriedade.

Os dados de entrada não precisam ser retirados de uma planilha. Eles podem ser valores estáticos, ou podem vir de uma conexão com um banco de dados, como o Microsoft Access ou o SQL Server, ou podem vir de outra planilha.

Em seguida, você precisa adicionar uma função pública chamada ‘Item’

Public Function Item(index As Integer) As MyItem
 Set Item = mItems.Item(index)
End Function

Isso permite que você se refira a objetos individuais dentro do objeto de coleção por seu número de índice. Essa função fornece um “espelho” do que está acontecendo na coleção “mMyItems” em segundo plano.

Você também precisará adicionar uma propriedade chamada ‘Count’ para que seu código possa estabelecer quantos objetos ‘MyItem’ existem na coleção ‘MyItems’, caso deseje iterar por ela.

Public Property Get Count() As Long
 Count = mItems.Count
End Property

Nesse caso, você só precisa de uma propriedade ‘Get’ porque ela é somente leitura. Ela usa a coleção mItems porque ela já tem uma propriedade de contagem incorporada.

Agora você tem um objeto (MyItems) com uma hierarquia completa definida pelo objeto ‘MyItem’.

Para que tudo isso funcione, agora você precisa preencher uma planilha (Planilha1) com dados para que a rotina Class Initialize possa coletá-los no objeto

Sua planilha deve ter a seguinte aparência:

lista itens detalhes

Uso do Novo Objeto

Agora você pode usar seu objeto Collection (MyItems) em um módulo VBA padrão do Excel. Digite o seguinte código:

Sub testar_objeto()
Dim MyClass As New MyItems, n As Integer
MsgBox MyClass.Count
For n = 1 To MyClass.Count
 MsgBox MyClass.Item(n).Item
 MsgBox MyClass.Item(n).Detail
Next n
End Sub

Esse código cria um objeto chamado “MyClass” com base no objeto de coleção que você criou chamado “MyItems”. Isso aciona a rotina “Initialize” que extrai todos os dados da planilha para o objeto.

Ela exibe o número de itens na coleção e, em seguida, percorre a coleção mostrando o texto “Item” e o texto “Detail”. Você notará que, ao fazer referência ao objeto “MyClass” em seu código, verá uma lista das duas propriedades de membro, o que ajuda a adicionar a propriedade correta.

Se você alterar o valor de uma célula nos dados de entrada da planilha, isso será automaticamente atualizado na coleção quando você executar o código acima novamente, pois quando você dimensiona o objeto, a rotina de inicialização é executada e coleta todos os novos dados.

Se você usar a palavra “Static” em vez de “Dim”, a rotina de inicialização não será executada e os valores antigos serão mantidos, desde que o código esteja em execução contínua. Se os dados da planilha forem alterados, isso não será refletido no objeto.

Sub Teste_Static()
Static Myclass As New MyItems, n As Integer
For n = 1 To Myclass.Count
 MsgBox Myclass.Item(n).Item
 MsgBox Myclass.Item(n).Detail
Next n
End Sub

Resumo da Criação de um Objeto Usando um Módulo de Classe

Como você viu, criar uma hierarquia de módulos de classe para usar como um objeto é algo bastante complicado, mesmo para uma estrutura tão simples quanto o exemplo fornecido aqui. A possibilidade de cometer erros é enorme!

No entanto, há grandes vantagens em tornar seu código mais elegante e fácil de ler. Também é mais fácil compartilhar com outros aplicativos e desenvolvedores do Excel, transformando-o em um Add-In.

Neste exemplo de como criar um objeto para armazenar dados, seria uma abordagem normal criar uma matriz multidimensional para armazenar os dados da planilha de várias colunas e escrever uma linha de código para atualizar ou ler cada elemento da matriz. Isso provavelmente acabaria sendo bastante confuso, e erros poderiam ser facilmente cometidos no endereçamento dos vários elementos.

Com seu novo objeto, você pode simplesmente fazer referência a ele e aos membros que criou abaixo dele para manter os dados.

Além disso, se os dados forem alterados na planilha (ou em um banco de dados vinculado, se você tiver usado isso como fonte de dados no módulo de classe), sempre que você usar a instrução ‘Dim’, a rotina de inicialização será chamada e os dados serão atualizados instantaneamente. Não há necessidade de escrever código para preencher novamente sua matriz.

Uso de um Módulo de Classe para Criar um Repositório de Variáveis

Quando você escreve código VBA, usa variáveis em todos os lugares, todas com escopos diferentes. Algumas podem ser definidas apenas para um procedimento específico, outras para um módulo específico e outras podem ser variáveis globais que podem ser usadas em todo o aplicativo

Você pode criar um módulo de classe que conterá um grande número de variáveis e, por ser um objeto, pode ser usado em qualquer lugar do código, até mesmo em um formulário de usuário ou em um controle Active X que você tenha colocado em uma planilha.

A vantagem adicional é que, ao fazer referência ao objeto variável, você verá uma lista de todos os nomes de variáveis mantidos no objeto, classificados em ordem crescente.

Para criar um repositório, você precisa inserir um novo módulo de classe. Para isso, use Inserir | Módulo de classe no menu do Editor VB.

Altere o nome para “MyVariables” usando a mesma metodologia discutida anteriormente neste artigo.

Digite o seguinte código:

Private mV As Variant
Public Property Get Variable1() As Variant
Variable1 = mV
End Property

Public Property Let Variable1(ByVal vNewValue As Variant)
mV = vNewValue
End Property

Public Property Get Variable2() As Variant
Variable1 = mV
End Property

Public Property Let Variable2(ByVal vNewValue As Variant)
mV = vNewValue
End Property

Esse código define as propriedades ‘Let’ e ‘Get’ para duas variáveis (‘Variable1’ e ‘Variable2’). As propriedades Let e Get são necessárias para cada uma de suas variáveis para que elas possam ser lidas/gravadas

Você pode usar seus próprios nomes para as variáveis em vez dos nomes de exemplo neste código, e pode adicionar outras variáveis, certificando-se de que cada nova variável tenha uma declaração ‘Let’ e ‘Get’.

A declaração privada da variável “mV” serve para criar uma variável de trabalho que só é usada no módulo de classe para transferir valores.

Para usar o repositório de variáveis, insira o seguinte código em um módulo padrão:

Global VarRepo As New MyVariables
Sub TestVariableRepository()
MsgBox VarRepo.Variable1
VarRepo.Variable1 = 10
MsgBox VarRepo.Variable1
End Sub

Esse código cria uma instância global do objeto “MyVariables” que você criou. Você só precisa fazer essa declaração uma vez em qualquer parte do seu código.

O código primeiro exibe o valor de ‘Variable1’ para mostrar que está vazio.

Um valor de 10 é atribuído a ‘Variable1’ e o novo valor dentro do objeto é exibido para mostrar que essa propriedade agora contém esse valor.

Como a instância do objeto ‘MyVariables’ foi definida globalmente, você pode fazer referência a qualquer uma das variáveis definidas no objeto de qualquer lugar do seu código.

Essa é uma grande vantagem, pois, se quiser usar as variáveis em qualquer parte do código, você só precisará definir uma variável global e, a partir dessa instância, todas as variáveis poderão ser acessadas e modificadas livremente em todo o código.

Transformando seu Objeto em um Suplemento

Até agora, o código para a criação do objeto está dentro do aplicativo da pasta de trabalho. No entanto, se quiser compartilhar seu objeto com outros desenvolvedores ou em outros aplicativos do Excel, você pode transformá-lo em um Suplemento (Add-In).

Para fazer isso, basta salvar o arquivo como um Suplemento. Selecione Arquivo | Salvar como e uma janela do navegador será exibida.

Selecione o tipo de arquivo como Suplemento do Excel (.xlam) no menu suspenso de tipo de arquivo e clique em OK. Por padrão, o arquivo será salvo na pasta Add-In, mas você pode alterar o local.

Em seguida, você pode incorporar o arquivo de suplemento aos seus aplicativos do Excel, o que lhe dá flexibilidade para usar o novo objeto.

salvar como addin

Para incluir seu novo suplemento no Excel, clique em Arquivo na faixa de opções do Excel e, em seguida, clique em Opções na parte inferior do painel esquerdo.

Clique em “Suplementos” no painel à esquerda na janela pop-up que aparece. Na parte inferior da janela, há um botão chamado “Ir

Clique nesse botão e uma janela pop-up “Add-In” será exibida. Clique em “Procurar” e localize o arquivo do Add-In. Assim, você poderá fazer referência ao objeto no código.

localizar suplemento ir

 

vba-free-addin

Exemplos de Add-ins de Códigos VBA

Acesse facilmente todos os exemplos de código que se encontram em nosso site.

Simply navigate to the menu, click, and the code will be inserted directly into your module. .xlam add-in.

(Nenhuma instalação necessária!)

Baixe de Graça

Retornar aos Exemplos de Códigos VBA