如何在VBA中使用类似于VB.NET的类对象模块之间的比较方法?

Ari*_*rie 24 vb.net comparison vba interface class

由于VBA中的新项目,我从VB.NET转移,说实话,不知道如何在这里处理对象类.我想要达到的是比较不同类对象模块之间的对象.

例如

class Employee
     属性:Name,Age
     point是:比较Name两个Employees之间的s

类:员工经理
的观点是:比较Name员工Name经理

我知道如何在VB.NET中,但如何比较VBA中不同类模块对象的属性?

小智 76

VBA不支持类多态,所以我建议改变你对类EmployeeManager类的思考方式.

你不能有一个Employee类的基类,然后一个单独的Manager那类派生Employee.它们可以是两个实现通用接口的独立类.

我稍后会详细讨论它.我们现在来看几个例子......


↓简单的方法↓


base类(Person)类和子类,其从基类派生.(适用于C#,VB.NET等)

但在VBA中你必须这样想:

一个基类,它公开描述位置的枚举属性.

就像是

在此输入图像描述

在此输入图像描述

这是让类暴露某些属性的最简单方法.它允许您将Person对象添加到集合中,并使用Intellisense的easy for each循环进行迭代!

在此输入图像描述

属性比较系统将非常容易

在此输入图像描述

注意:同样适用于枚举,因为它隐式转换为数字


↓更复杂的方法↓


两个独立的类,都暴露公共属性.例如,你有一个EmployeeManager类都实现了一个Person接口和一个Comparer暴露Compare()方法的附加类

在此输入图像描述

在您的VBA项目中,您需要4个类模块和一个标准模块

在此输入图像描述

Person (这是你的界面)

Public Property Get Name() As String
End Property

Public Property Get Age() As Long
End Property
Run Code Online (Sandbox Code Playgroud)

这个类是其中两个接口EmployeeManager两个需要实现一些共同的功能(干将的姓名和年龄).使用接口允许您使用接口类型变量作为枚举器来执行每个循环.你会在一分钟内看到.

Employee并且Manager完全相同.显然,您可以修改它们以适合您的现实生活解决方案.

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
Run Code Online (Sandbox Code Playgroud)

ComparerCls 您将使用此类的实例来比较两个对象属性或引用.你不一定需要有一个类,但我更喜欢这样.

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
Run Code Online (Sandbox Code Playgroud)

和你的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
Run Code Online (Sandbox Code Playgroud)

运行Main()sub并在立即窗口中检出结果

在此输入图像描述

上述代码的最佳部分是您正在创建Person接口的引用变量.它允许您遍历实现该接口的集合中的所有项目.此外,如果你有更多的属性和功能,你可以使用Intellisense.


对照


再看看ComparerCls课堂上的代码

在此输入图像描述

我希望你现在看到为什么我把它分开来成为一个班级.它的目的只是为了处理对象的比较方式.您可以指定Enum顺序并修改Compare()方法本身以进行不同的比较.请注意Optional参数,它允许您在没有比较方法的情况下调用Compare方法.

在此输入图像描述

现在,您可以将不同的参数传递给比较功能.看看结果如何.

尝试组合:

emp.Name = "name"
man.Name = "name"

Comparer.Compare(emp, name, Names)
Comparer.Compare(emp, name, References)

Comparer.Compare(emp, emp, References)
Run Code Online (Sandbox Code Playgroud)

如果仍然不清楚,请参阅有关ImplementsVBA中关键字的答案

  • +1真棒答案!很有用!不知道我们可以在VBA中使用接口! (5认同)