我在VBA中定义了一个类,如下所示
班级员工(clsEmployee):
Private pEmpName As String
Private pEmpID As Long
Private pDOJ As Date
Private pManager As clsEmployee
Private pOffice As clsOffice
其中pManager是clsEmployee类的类的属性,pOffice也是clsOffice类的类的属性(另一个类)
我还在类中定义了Let和Get方法来读取和写入类的属性,如下所示
Public Property Let Name(sName As String)
If sName <> "" Then
pEmpName = sName
End If
End Property
Public Property Get Name() As String
Name = pEmpName
End Property
Public Property Let EmployeeId(lngID As Long)
If IsNumeric(lngID) Then
pEmpID = lngID
End If
End Property
Public Property Get EmployeeId() As Long
EmployeeId = pEmpID
End Property
Public Property Let PDM(obj As clsEmployee)
Set pPDManager = obj
End Property
Public Property Get PDM() As clsEmployee
Set PDM = pPDManager
End Property
现在在代码模块中我写了一个test
子来设置我的Employee类的一些属性,如下所示
Sub test()
Dim obj As clsEmployee
Set obj = New clsEmployee
obj.Name = "Employee 100"
obj.EmployeeId = 11111111
obj.PDM.Name = "Employee 1"
当代码执行语句obj.Name="Employee 100"
时,执行Name
的Let属性并设置pEmpName,而当代码尝试执行statemnet obj.PDM.Name="Employee 1
时,VBA执行GET method PDM
。
我的问题是为什么get
方法(类中的PDM)在语句`obj.PDM.Name =“Employee 1”上执行时,显然我试图设置属性而不是检索它。 / p>
答案 0 :(得分:5)
其中pManager是clsEmployee类型的类的属性
此类clsEmployee
的每个实例都必须引用另一个表示管理器的clsEmployee
实例。员工必须有经理。
属性PDM
返回clsEmployee
因此需要使用Set
Public Property Set PDM(obj As clsEmployee)
Set pManager = obj
End Property
Public Property Get PDM() As clsEmployee
Set PDM = pManager
End Property
为什么get方法(类中的PDM)在语句`obj.PDM.Name =&#34; Employee 1&#34;
员工有经理。该经理可通过酒店PDM
访问。如果我们在变量obj
中引用了员工,并且我们想要更改该员工的经理姓名,我们必须联系其经理。这就是调用PDM
的原因。所以我们到了经理那里可以改名。 HTH
现在可以修改测试方法如下。
Option Explicit
Sub test()
Dim mgr As clsEmployee
Set mgr = New clsEmployee
Dim obj As clsEmployee
Set obj = New clsEmployee
Set obj.PDM = mgr
obj.Name = "Employee 100"
obj.EmployeeId = 11111111
obj.PDM.Name = "Employee 1"
End Sub
当我们想要一个设置对象引用的属性时,我们需要使用Set-Property
。否则Let
就足够了。
按照惯例,我们使用Set
作为对象引用,就像您的员工一样。员工是Name
,Id
,DateOfBirth
等数据的组合。
Let
适用于string
,integer
,bool
等原子数据。
查看Worksheet
类Excel
库。此类具有属性Name
,其类型为string
。如果我们有一个引用特定工作表的变量,那么我们可以像这样更改工作表的名称:
Dim w as Worksheet
Set w = Worksheets(1)
Let w.Name = "Demo1"
请注意Let
。因为使用了Name
string-Property
Let
。但是,关键字Let
可以省略。
Worksheet
具有Parent
类型的属性Object
,它是对特定工作集的父级的引用。如果我们想改变父母,我们会写:
Dim w as Worksheet
Set w = Worksheets(1)
Set w.Parent = new Parent ' Is just example, it won't compile, Parent is read-only :)
如果需要Set
,则不能像Let
那样省略它。
在您的情况下,与clsEmployee
一起使用的属性必须使用Get-Set
其中使用的属性,例如string
Get-Let
使用Realm.init(context);
RealmLog.setLevel(LogLevel.WARN);
。
Here in my Dropbox 我创造了一个非常丑陋的图片,应该说明 变量obj和mgr中对象引用的情况。