在VBA中链接类

时间:2017-06-24 12:56:18

标签: vba excel-vba class oop object

我在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>

1 个答案:

答案 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作为对象引用,就像您的员工一样。员工是NameIdDateOfBirth等数据的组合。 Let适用于stringintegerbool等原子数据。

查看WorksheetExcel库。此类具有属性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中对象引用的情况。