Este tutorial irá ensiná-lo sobre os módulos de classe em VBA. Você aprenderá o que são e como usá-los.
Módulos de classe VBA - Introdução
Quando você insere módulos no Editor do Visual Basic (VBE) para inserir seu código, você deve ter notado que também pode inserir o que é chamado de 'Módulo de Classe'.
Módulos de classe vs. Módulos
Os módulos de classe funcionam de uma maneira muito diferente dos módulos comuns, pois facilitam a criação de um Modelo de Objeto Componente (COM) que pode então ser usado dentro de seu código VBA normal
Efetivamente, você cria um objeto que funciona da mesma maneira que um objeto construído no Excel, como ‘planilhas’. No Objeto de planilhas, você tem uma série de propriedades e métodos que 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 maneira, você está criando um bloco de construção que pode ser usado em qualquer lugar do VBA. O Object tem várias propriedades e métodos que podem ser acessados por seu código VBA de qualquer lugar dentro da pasta de trabalho sem ter que reescrever o código novamente.
Além de se referir ao seu novo objeto de um módulo VBA padrão, você também pode usá-lo no código por trás de um formulário de usuário que faz parte do seu aplicativo personalizado
Você também pode usá-lo onde colocou os 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 para esses controles.
Você também pode transformar seu objeto em um suplemento do Excel. Seu objeto estará automaticamente disponível para outros usuários que carregaram esse suplemento. Isso adiciona sua própria arquitetura multicamadas ao seu aplicativo Excel
O Excel é um aplicativo de várias camadas. Existe a camada de serviços do cliente, que conduz a janela real da planilha 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 motor do Excel. Observe que seu novo objeto também será exibido aqui.
Finalmente, por baixo de tudo isso, você tem a camada de serviços de dados que contém todos os dados que você inseriu nas planilhas e células. O Excel acessa isso usando o modelo de objeto do Excel.
Criar 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 de usar módulos de classe
- Você pode desenvolver um bloco de construção robusto que pode ser usado em qualquer número de aplicativos Excel diferentes
- Depois de totalmente testado, pode-se confiar que sempre produzirá os resultados corretos da mesma forma que os objetos embutidos do Excel
- Se as atualizações forem feitas no código em outro lugar no aplicativo, o novo objeto continuará a funcionar da mesma maneira
- Você pode usar seu novo objeto em outros aplicativos do Excel como um suplemento
- Os objetos podem ser reutilizados em outros aplicativos e ajudam na depuração
Desvantagens de usar módulos de classe
- Eles podem ser difíceis de criar e entender.
- As convenções de nomenclatura são muito importantes porque é isso que você verá ao usar seu objeto em um módulo normal.
- Se você ainda não criou um módulo de aula, eles podem ser difíceis de entender e há uma curva de aprendizado íngreme
- Impossível fazer alterações em tempo de execução - você tem que reconfigurar o projeto.
- Se as propriedades e as variáveis privadas tiverem o mesmo nome, podem ocorrer loops infinitos, resultando em erros
Inserindo um Módulo de Classe
Selecione Inserir | Módulo de classe no menu VBE (Editor do Visual Basic). O novo módulo de classe será automaticamente chamado de 'Classe 1', mas isso precisa ser alterado imediatamente para o nome que você vai usar para o seu objeto
Você altera o nome na janela Propriedades para onde a seta está apontando. Você simplesmente digita seu novo nome, e isso mudará na coleção de Módulos de Classe
Se a janela Propriedades não estiver visível, selecione Exibir | 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.
Criando um Item de Objeto
Este exemplo criará um objeto de nível superior denominado ‘MyItems’ com um objeto membro abaixo dele denominado ‘MyItem’, que conterá os dados individuais de cada item. Uma vez criado, ele funcionará da mesma maneira que um Objeto Excel embutido. Por exemplo, existe um objeto chamado ‘Planilhas’, que é uma coleção de cada planilha dentro de sua pasta de trabalho. Há também um objeto chamado ‘Planilha’ que representa cada planilha individual em sua pasta de trabalho e contém todas as propriedades e métodos de cada planilha. Este objeto está relacionado ao objeto da coleção ‘Planilhas’.
Você pode iterar através da coleção 'Planilhas', visualizando cada 'Planilha' por vez. Da mesma forma, você será capaz de iterar através da coleção ‘MyItems’ visualizando as propriedades que você criou no membro ‘Myitem’.
A primeira coisa a fazer é criar o subobjeto para o nível de membro que conterá os itens reais dentro da coleção do objeto de nível superior. Este é o equivalente aos membros (por exemplo, nome, visível, contagem) dentro do objeto ‘Folha’ no Excel. Este código é inserido no módulo de classe chamado ‘MyItem’
Módulos de classe têm propriedades e métodos. Propriedades são efetivamente como variáveis, pois contêm valores de dados como variáveis, e Métodos são como sub-rotinas ou funções.
No subobjeto vamos criar duas propriedades para o objeto - Item e Detalhe
Inicialmente, duas variáveis de string precisam ser declaradas para conter os valores das propriedades:
12 | MItem privado como stringMDetail privado como string |
Eles precisam ser declarados na seção Declarações no topo do código do módulo de classe para que possam ser usados em todas as sub-rotinas em todo o módulo
Eles precisam receber nomes exclusivos para torná-los diferentes das propriedades que iremos criar, então um 'm' (para membro) foi colocado na frente de cada nome.
As variáveis são declaradas como Privadas para que não possam ser vistas por ninguém que use o objeto. Eles são variáveis de trabalho para uso dentro do código do objeto e não estão lá como parte do objeto final.
A próxima etapa é configurar o código para dar acesso às duas propriedades. Isso é feito por meio de uma declaração Property Let e Property Get para cada propriedade. Eles devem ser Públicos, caso contrário, o objeto de nível superior não terá nenhuma propriedade visível
123456789101112131415 | Propriedade pública Let Item (vdata As String)mItem = vdataPropriedade FinalPropriedade pública Get Item () As StringItem = mItemPropriedade FinalDetalhe de propriedade pública (vdata As String)mDetail = vdataPropriedade FinalPublic Property Get Detail () As StringDetalhe = mDetailPropriedade Final |
Este código cria os meios para ler e gravar valores nas duas propriedades (Item e Detalhe) 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 declaraçã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 incorreta - uma em que você pode ler e outra em que você pode escrever!
Para ajudar na criação deste código, você pode usar Insert | 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 onde você digita o nome da propriedade e seleciona ‘Propriedade’ nos botões de opção:
Clique em 'OK' e o código do esqueleto será adicionado ao módulo da classe:
1234567 | Propriedade pública Get MyProperty () As VariantPropriedade FinalPropriedade pública Let MyProperty (ByVal vNewValue As Variant)Propriedade Final |
Isso evita erros nos nomes das propriedades. Você simplesmente adiciona seu código entre as instruções "Propriedade pública" e "Propriedade final".
Agora você tem um objeto chamado ‘MyItem’ que conterá todos os dados para este exercício.
Cansado de procurar exemplos de código VBA? Experimente o AutoMacro!
Criando uma coleção
O próximo estágio é criar um objeto de nível superior como um objeto Collection para dar acesso às propriedades que você configurou no objeto ‘MyItem’
Novamente, você precisa definir um objeto de trabalho para atuar como o objeto de coleção da mesma forma que definiu as duas variáveis de string no objeto ‘MyItem’.
1 | Itens privados como coleção |
Novamente, isso deve ter um nome exclusivo, é por isso que há um 'm' (objeto membro) na frente do nome, e também é declarado como 'Privado' para que não apareça quando o novo objeto está sendo usado
Em seguida, você precisa preencher o código Class_Initialize. Isso é executado quando você usa o objeto pela primeira vez em seu código e determina quais valores serão carregados no objeto
Você pode acessar esta sub-rotina selecionando ‘Class’ no primeiro menu suspenso e ‘Initialize’ no segundo menu suspenso da janela do módulo
12345678910 | Sub Class_Initialize privada ()Dim objItem As MyItemDefinir mItems = Nova coleçãoPara n = 1 a 3Definir objItem = Novo MyItemobjItem.Item = Worksheets ("Plan1"). Range ("a" & n) .ValueobjItem.Detail = Worksheets ("Sheet1"). Range ("b" & n) .ValuemItems.Add objItemPróximo nEnd Sub |
O código configura um objeto chamado ‘objItem’ usando a definição de ‘MyItem’ que construímos como um módulo de classe anteriormente.
Em seguida, ele cria uma nova coleção com base no objeto 'mItems' definido anteriormente
Ele itera por meio de valores mantidos na Planilha1 da pasta de trabalho e os coloca nas propriedades que criamos para o objeto ‘MyItem’. Observe que quando você usa ‘objitem’, uma lista suspensa aparece mostrando as duas propriedades, exatamente como se você estivesse usando um objeto embutido do Excel.
O objeto de item é então adicionado ao objeto de coleção que agora contém todos os dados nos valores de propriedade.
Os dados de entrada não precisam ser retirados de uma planilha. Podem ser valores estáticos, ou podem vir de uma conexão com um banco de dados, como o Microsoft Access ou SQL Server, ou podem vir de outra planilha.
Em seguida, você precisa adicionar uma função pública chamada ‘Item’
123 | Item de função pública (índice como inteiro) como MyItemDefinir Item = mItems.Item (índice)Função Final |
Isso permite que você se refira a objetos individuais dentro do objeto de coleção por seu número de índice. Esta 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’ estão na coleção ‘MyItems’, caso deseje iterar por meio dela.
123 | Propriedade pública obter contagem () contanto queCount = mItems.CountPropriedade Final |
Neste caso, você só precisa de uma propriedade ‘Get’ porque é somente leitura. Ele 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 fazer tudo funcionar, agora você precisa preencher uma planilha (Folha1) com dados para que a rotina de inicialização da classe possa coletar isso no objeto
Sua planilha deve ser assim:
Usando Seu Novo Objeto
Agora você pode usar seu objeto Collection (MyItems) em um módulo VBA padrão do Excel. Insira o seguinte código:
12345678 | Sub test_object ()Dim MyClass As New MyItems, n As IntegerMsgBox MyClass.CountPara n = 1 para MyClass.CountMsgBox MyClass.Item (n) .ItemMsgBox MyClass.Item (n) .DetailPróximo nEnd Sub |
Este código cria um objeto chamado ‘MyClass’ com base no objeto de coleção que você criou, chamado ‘MyItems’. Isso dispara a rotina ‘Inicializar’ que extrai todos os dados da planilha para o objeto.
Ele exibe o número de itens na coleção e, em seguida, itera através da coleção mostrando o texto 'Item' e o texto 'Detalhe'. Você notará que, ao se referir ao objeto ‘MyClass’ em seu código, verá uma lista das duas propriedades de membro que ajudam 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 ao dimensionar o objeto, a rotina de inicialização é executada e coleta todos os novos dados
Se você usar a palavra ‘Estático’ 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
1234567 | Sub Test_Static ()Static Myclass As New MyItems, n As IntegerPara n = 1 para Myclass.CountMsgBox Myclass.Item (n) .ItemMsgBox Myclass.Item (n) .DetailPróximo nEnd 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 é um negócio bastante complicado, mesmo para uma estrutura tão simples como o exemplo fornecido aqui. A margem para cometer erros é enorme!
No entanto, ele tem 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 manter os dados da planilha de várias colunas, e você escreveria uma linha de código para atualizar ou ler cada elemento em a matriz. Isso provavelmente acabaria sendo muito confuso e erros poderiam ser facilmente cometidos ao abordar os vários elementos.
Com seu novo objeto, você pode simplesmente referir-se a ele e aos membros que criou abaixo dele para armazenar os dados.
Além disso, se os dados mudarem na planilha (ou em um banco de dados vinculado se você tiver usado isso como uma fonte de dados dentro do seu 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.
Usando um módulo de classe para criar um repositório de variáveis
Ao escrever código VBA, você usa variáveis em todos os lugares, todos com escopos diferentes. Alguns podem ser definidos apenas para um procedimento específico, alguns para um módulo específico e alguns 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 dentro do seu código, mesmo em um formulário de usuário ou em um controle Active X que você colocou em uma planilha.
A vantagem adicional é que, ao se referir ao seu objeto variável, você verá uma lista de todos os nomes de variáveis contidos no objeto classificados em ordem crescente.
Para criar um repositório, você precisa inserir um novo módulo de classe. Você pode fazer isso usando Insert | Módulo de classe do menu VB Editor
Altere o nome para ‘MyVariables’ usando a mesma metodologia discutida anteriormente neste artigo.
Insira o seguinte código:
12345678910111213141516 | MV privado como variantePropriedade pública Get Variable1 () As VariantVariável 1 = mVPropriedade FinalPropriedade pública Let Variable1 (ByVal vNewValue As Variant)mV = vNewValuePropriedade FinalPropriedade pública obter variável2 () como varianteVariável 1 = mVPropriedade FinalPropriedade pública Let Variable2 (ByVal vNewValue As Variant)mV = vNewValuePropriedade Final |
Este código configura 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 sejam de leitura / gravação
Você pode usar seus próprios nomes para as variáveis em vez dos de amostra neste código, e você pode adicionar outras variáveis, certificando-se de que cada nova variável tenha uma instrução ‘Let’ e ‘Get’.
A declaração privada da variável 'mV' é para criar uma variável de trabalho que só é usada dentro do 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:
123456 | Global VarRepo como novas MyVariablesSub TestVariableRepository ()MsgBox VarRepo.Variable1VarRepo.Variable1 = 10MsgBox VarRepo.Variable1End Sub |
Este código cria uma instância global de seu objeto ‘MyVariables’ que você criou. Você só precisa fazer essa declaração uma vez de qualquer lugar dentro 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 ‘Variável1’ e o novo valor dentro do objeto é então exibido para mostrar que esta propriedade agora contém este valor.
Como a instância do objeto ‘MyVariables’ foi definida globalmente, você pode se referir a qualquer uma das variáveis definidas dentro do objeto de qualquer lugar em seu código.
Isso tem uma grande vantagem, pois se você deseja usar suas variáveis em qualquer lugar do código, só precisa definir uma variável global e, a partir dessa instância, todas as variáveis podem ser acessadas e modificadas livremente em todo o código.
Transformando Seu Objeto em um Add-In
Até agora, o código para a criação do objeto está em seu aplicativo de pasta de trabalho. No entanto, se você deseja poder compartilhar seu objeto com outros desenvolvedores ou em outros aplicativos Excel de sua preferência, você pode transformá-lo em um Add-In
Para fazer isso, tudo o que precisa acontecer é salvar o arquivo como um suplemento. Selecione Arquivo | Salvar como e uma janela do navegador aparecerá
Selecione o tipo de arquivo como Add-In (.xlam) no menu suspenso de tipo de arquivo e clique em OK. O arquivo será salvo na pasta Add-In por padrão, mas você pode alterar o local.
Você pode então incorporar o arquivo add-in em seus aplicativos Excel, dando-lhe a flexibilidade de fazer uso de seu novo objeto
Para incluir seu novo Add-In no Excel, clique em Arquivo na faixa do Excel e, a seguir, clique em Opções na parte inferior do painel esquerdo
Clique em ‘Add-Ins’ no painel esquerdo da janela pop-up que aparece. Na parte inferior da janela, há um botão marcado como ‘Ir’
Clique aqui e uma janela pop-up ‘Add-In’ aparecerá. Clique em ‘Procurar’ e localize o arquivo Add-In. Você poderá então referir-se ao seu objeto em seu código.