让我们在VBA类中获取属性

时间:2017-07-02 10:03:49

标签: vba excel-vba class oop object

我已经定义了两个VBA类clsEmployee和clsEmployees。

类clsEmployee包含属性“Name”,EmployeeId和DOJ,以及用于读取和写入值的各自的let和get属性 和clsEmployees定义如下

Option Explicit
Option Base 1

Public pEmployees As Dictionary

Private Sub Class_Initialize()
    Set pEmployees = New Dictionary
End Sub

Private Sub Class_Terminate()
    Set pEmployees = Nothing
End Sub



Public Property Get Employee() As Dictionary
    Set Employee = pEmployees
End Property

AFAIK当我们写入对象属性时调用属性,当我们读取类对象的属性时调用Get属性。

但任何人都可以解释为什么在执行以下语句时调用clsEmployees的Get属性

objEmployees.Employee.Add objEmployee, objEmployee

我觉得我们正在尝试设置/编写应该调用Let属性的Employees类对象的属性。

1 个答案:

答案 0 :(得分:4)

调用Get属性只是因为您引用它:

objEmployees.Employee.anything_here

将调用Get例程。你可以看看这里的点来提供帮助。 第一个点获取Employee对象,第二个点然后进行写入。所以最终它是一个写操作,但你先做了第一次。

如果您想避免这种情况,那么您可以使用AddEmployee例程:

Sub AddEmployee(objEmployee As Employee)
    ' now you can reference the class member
    pEmployees.Add objEmployee, objEmployee
End Sub

并使用objEmployees.AddEmployee objEmployee调用它。这似乎有点不必要,但如果您想要验证哪些员工正在被添加,那么这种效用就会变得更加明显。简单检查是否存在第二次添加同一员工的问题 - 使用Function而不是Sub

Function AddEmployee(objEmployee As Employee) As Boolean
    Dim blnAdded as Boolean
    If Not pEmployees.Exists(objEmployee) Then
        pEmployees.Add objEmployee, objEmployee
        blnAdded = True
    Else
        blnAdded = False
    End if
    AddEmployee = blnAdded
End Function

在您的代码中,因为您已将pEmployees声明为Public,您实际上只能从Module或其他任何代码中引用该代码:

pEmployees.Add objEmployee, objEmployee