Como usar methods de comparação entre módulos de object de class no VBA de maneira semelhante ao VB.NET?

Devido a um novo projeto em VBA eu mudei do VB.NET, para ser honesto, não sei realmente como lidar com as classs de objects aqui. O que eu quero alcançar é comparar objects entre diferentes módulos de object de class.

por exemplo

Empregado de class
propriedades: Name , Age
o ponto é: compare o Name s entre dois empregados

classs: Empregado e Gerente
o ponto é: compare o Name do empregado com o Name do gerente

Eu sei como no VB.net, mas como comparar propriedades de objects de módulo de class diferentes no VBA?

O VBA não suporta o polymorphism de classs, então eu recomendo mudar a maneira como você está pensando nas classs Employee e Manager .

Você não pode ter uma class Employee como uma class base e, em seguida, uma class Manager separada que deriva do Employee . Eles podem ser duas classs separadas implementando uma interface comum.

Vou falar sobre isso em detalhes daqui a pouco. Vamos agora passar por alguns exemplos …


↓ abordagem fácil ↓


Uma class base ( Person ) e classs filho que derivam da class base. ( aplica-se a c #, vb.net, etc )

mas no VBA você tem que pensar assim:

Uma class base que expõe uma propriedade enum descrevendo a posição.

Algo como

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Esta é a maneira mais fácil de ter uma class expondo algumas propriedades. Ele permite que você adicione seus objects Person em uma coleção e faça iterações usando o método easy for each loop com o Intellisense !

insira a descrição da imagem aqui

Sistema de comparação de propriedades seria muito muito fácil

insira a descrição da imagem aqui

note: o mesmo se aplica ao enum como seu implicitamente convertido em um número


↓ abordagem mais complexa ↓


Duas classs separadas que expõem as propriedades públicas. Por exemplo, você tem uma class Employee and Manager que implementa uma interface Person e uma class Comparer adicional expondo um método Compare() .

insira a descrição da imagem aqui

Em seu projeto VBA você precisa de 4 módulos de class e um módulo padrão

insira a descrição da imagem aqui

Person (esta é sua interface)

 Public Property Get Name() As String End Property Public Property Get Age() As Long End Property 

essa class é a interface que tanto o Employee quanto o Manager precisam implementar para compartilhar algumas funções comuns (getters for Names and Ages). Ter a interface permite que você faça o para cada loop usando a variável de tipo de interface como o enumerador. Você verá em um minuto .

Employee e Manager são idênticos. Obviamente, você pode modificá-los para se adequarem à sua solução da vida real .

 Implements Person Private name_ As String Private age_ As Long Public Property Get Name() As String Name = name_ End Property Public Property Let Name(ByVal Value As String) name_ = Value End Property Public Property Get Age() As Long Age = age_ End Property Public Property Let Age(ByVal Value As Long) age_ = Value End Property Private Property Get Person_Name() As String Person_Name = Name End Property Private Property Get Person_Age() As Long Person_Age = Age End Property 

ComparerCls você usará uma instância dessa class para comparar duas propriedades de objects ou referências . Você não precisa necessariamente ter uma aula para isso, mas eu prefiro assim.

 Public Enum ComparisonMethod Names = 0 ' default Ages = 1 References = 2 End Enum ' makes names the default comparison method Public Function Compare(ByRef obj1 As Person, _ ByRef obj2 As Person, _ Optional method As ComparisonMethod = 0) _ As Boolean Select Case method Case Ages Compare = IIf(obj1.Age = obj2.Age, True, False) Case References Compare = IIf(obj1 Is obj2, True, False) Case Else Compare = IIf(obj1.Name = obj2.Name, True, False) End Select End Function 

E o seu código Module1

 Option Explicit Sub Main() Dim emp As New Employee emp.Name = "person" emp.Age = 25 Dim man As New Manager man.Name = "manager" man.Age = 25 Dim People As New Collection People.Add emp People.Add man Dim individual As Person For Each individual In People Debug.Print TypeName(individual), individual.Name, individual.Age Next End Sub 

execute o sub Main() e confira os resultados na janela imediata

insira a descrição da imagem aqui

A melhor parte do código acima é o fato de você estar criando uma variável de referência da interface Person . Ele permite percorrer todos os itens da coleção que implementam a interface. Além disso, você pode usar o Intellisense, o que é ótimo se você tiver muitas outras propriedades e funções.


Comparação


Dê uma olhada novamente no código da class ComparerCls

insira a descrição da imagem aqui

Espero que você veja agora porque eu separei isso para ser uma aula. Sua finalidade é apenas cuidar da maneira como os objects estão sendo comparados. Você pode especificar a ordem Enum e modificar o método Compare() para comparar de maneira diferente. Observe o parâmetro Optional, que permite chamar o método Compare sem o método de comparação.

insira a descrição da imagem aqui

Agora você pode brincar passando parâmetros diferentes para a function de comparação. Veja como são os resultados.

Tente combinações:

 emp.Name = "name" man.Name = "name" Comparer.Compare(emp, name, Names) Comparer.Compare(emp, name, References) Comparer.Compare(emp, emp, References) 

Se algo ainda não estiver claro, consulte esta resposta sobre a palavra-chave Implements no VBA