VBA:使用值初始化对象?

时间:2012-03-23 14:16:47

标签: vba object variables initialization

我希望能够初始化

CArticle具有以下属性:

Private pNumber As String
Private pQuantity As Double

具有空值,预定义值或当前值。我怎样才能做到这一点?我正在考虑以下几点:

新空CArticle

pNumber
pQuantity

新假人CArticle

pNumber
pQuantity = 99999

新初始CArticle(number, quantity)

pNumber = number
pQuantity = quantity

2 个答案:

答案 0 :(得分:26)

颈部疼痛,但这是唯一的方法。

文件CArticle

Option Explicit

Private pNumber As String
Private pQuantity As Double

Private Sub Class_Initialize()
    pNumber = vbNullString
    pQuantity = 0
End Sub

Public Sub InitializeWithValues(ByVal number As String, ByVal quantity As Double)
    pNumber = number
    pQuantity = quantity
End Sub

Public Sub InitializeDefaultValues()
    pNumber = vbNullString
    pQuantity = 99999
End Sub

并在调用模块中

Dim art As New CArticle       ' Initialize value to empty
art.InitializeWithValues "Bowtie", 100     ' and assign values

Set art = New CArticle        ' Initialize values to empty
art.InitializeDefaultValues   ' Initialize values to default

答案 1 :(得分:0)

如果有人通过搜索到达这里,我也是。我建议改为查看StackOverFlow: Pass arguments to Constructor in VBA

中的答案

这不是我的答案,它来自Bgusach。我将其包含在此处是因为我看到一个有用的答案不仅仅是链接。

将参数传递给VBA中的构造函数

这里有一个I'm的小技巧,可以带来很好的效果。 Bgusach想与那些需要经常与VBA战斗的人分享。

1 .- 在每个自定义类中实现一个公共初始化子例程。我在所有课程中都将其称为InitiateProperties。此方法必须接受您要发送给构造函数的参数。

2 .- 创建一个名为factory的模块,并创建一个公共函数,其中包含单词“ Create”以及与该类相同的名称以及与构造函数相同的传入参数。该函数必须实例化您的类,并调用第(1)点中解释的初始化子例程,并传递接收到的参数。最后返回实例化和初始化的方法。

示例:

假设我们有自定义类Employee。如上例所示,必须使用名称和年龄实例化。

这是InitiateProperties方法。 m_name和m_age是我们要设置的私有属性。

Public Sub InitiateProperties(name as String, age as Integer)

    m_name = name
    m_age = age

End Sub

现在在工厂模块中:

Public Function CreateEmployee(name as String, age as Integer) as Employee

    Dim employee_obj As Employee
    Set employee_obj = new Employee

    employee_obj.InitiateProperties name:=name, age:=age
    set CreateEmployee = employee_obj

End Function

最后,当您要实例化员工

Dim this_employee as Employee
Set this_employee = factory.CreateEmployee(name:="Johnny", age:=89)

当您有多个班级时特别有用。只需在模块工厂中为每个函数放置一个函数,然后通过调用 factory.CreateClassA(arguments) factory.CreateClassB(other_arguments)等进行实例化即可。

编辑

正如stenci指出的那样,可以通过避免在构造函数中创建局部变量来使用terser语法执行相同的操作。例如,CreateEmployee函数可以这样写:

Public Function CreateEmployee(name as String, age as Integer) as Employee

    Set CreateEmployee = new Employee
    CreateEmployee.InitiateProperties name:=name, age:=age

End Function

哪个更好。