让VBA类模块的属性 - 是否可以有多个参数?

时间:2012-12-11 15:44:26

标签: vba class oop excel-vba properties

到目前为止,我对在类模块中使用Let属性的理解是你在类模块中设置它:

Dim pName as String
Public Property Let Name(Value As String)
    pName = Value
End Property

然后,在您创建了此类的对象后,您可以像这样设置此属性:

MyObject.Name = "Larry"



问题:是否有可能以某种方式在类属性中输入多个参数?例如:

Dim pFirstName as String, pLastName as String
Public Property Let Name(FirstName As String, LastName As String)
    pFirstName = FirstName
    pLastName = LastName
End Property

那么您如何在课堂外设置此属性?

MyObject.Name = ??

或者这是不可能做到的?

3 个答案:

答案 0 :(得分:13)

我知道已经有2个解决方法,但我认为回答你原来的问题值得一试,因为这个问题的意见数量很多。

答案

  

是否可以在VBA中的Let属性中包含多个参数?

YES!这是可能的。

首先让我们谈谈GET属性。考虑这是Class1

Private firstName as String
Private lastName as String

Public Property Get Name() As String
    Name = firstName & " " & lastName
End Property

Name属性将返回全名,这很棒,但如何使用 Let 属性来指定{ {1}}& firstName一气呵成?

旁注:您可以传递一个用特殊字符分隔的字符串,并将其拆分到lastName的正文中,并分配Letfirst名称 但忘记了,让我们正确地完成它......

好的,在VBA中,当前设置的默认 last 属性将采用1个参数并将其分配给名字或姓氏......

类似的东西:

Let

规则:Public Property Let Name(value As String) firstName = value End Property 不带参数,Get取一个参数。这是非常符合逻辑的,因为Let返回基础值,但Get需要从某处获取值,以便将其分配给它代表的数据。值得记住的是,Let属性是通过Let符号分配的。 =

我们知道,如果我们与上述规则保持一致,理论上我们应该能够add one parameter to the Getone more to the Let

让我们忘记myObject.Name = "IdOnKnuu" - 暂时将其评论 - 并将参数添加到Let属性。

Get

返回Private firstName As String Private lastName As String Public Property Get Name(first As String) As String Name = firstName & " " & lastName End Property 'Public Property Let Name(value As String) ' firstName = value 'End Property 创建Module1的实例并输入Class1

enter image description here

哦,智能期待什么?真棒!

此时我们值得了解的是,我们的c.Name(属性返回Get ,目前都是空的,所以它并不重要你将要传递给first + last它会返回一个空字符串。

好的,让我们现在取消注释并调整c.Name()属性...

边节点:如果你跳回Let并输入Module1并且没有智能感,那么这意味着c.中的某些内容被破坏了......我们已经知道 - 它是造成它的Class1财产

我们在Let属性中添加了一个参数,让我们对Get属性执行相同操作...

Let

让我们回到Public Property Let Name(first As String, value As String) firstName = value End Property 并尝试使用Module1属性:

请记住,您之前如何使用Let属性?您需要为其分配值

Let

但是现在,您的c.Name = "John" 属性需要额外的参数Let

为什么我们不尝试这个:

first as String

喂!编译并运行(快速 F5

太棒了,让我们检查一下结果吧!

c.Name("John") = "Smith"

嗯...只在立即窗口显示Debug.print c.Name("John") Ctrl + G )...不完全是我们要找的...... ..

回到Smith属性我们注意到我们通过参数获取2个值,但我们只使用其中一个值?我们有两个不同的值进入函数,对吗?我们将第一个视为Let,将第二个视为firstName

lastName

回到Public Property Let Name(first As String, last As String) firstName = first lastName = last End Property

Module1

并重新运行当前代码,为我们提供了我们所需要的...它打印 John Smith ,但等待!!!为什么我们必须传递名字才能检索全名?

哈!这样做的诀窍是制作两个属性Optional

的第一个参数

总结一下,代码:

<强> Class1.cls

Sub Main()

    Dim c As New Class1

    c.Name("John") = "Smith"

    Debug.Print c.Name("John")

End Sub

<强> Module1.bas

Private firstName As String
Private lastName As String

Public Property Get Name(Optional first As String) As String
    Name = firstName & " " & lastName
End Property

Public Property Let Name(Optional first As String, last As String)
    firstName = first
    lastName = last
End Property

因此,基本上可以在VBA中通过 Sub Main() Dim c As New Class1 c.Name("John") = "Smith" Debug.Print c.Name ' prints John Smith End Sub 属性分配两个(或更多)值。可能会让你失望的是它的语法,但我希望我在这个答案中的解释能帮助你理解事物的来源和原因。

Let属性采用可选参数 - 它实际上只是一个虚拟参数 ...它没有在任何地方使用在Get属性中,但它允许我们获得所需的Get签名,并允许我们将两个参数传递给它。它还允许容易记住Let语法。

电话

c.Name

仍然是可能的,但Debug.Print c.Name("first") 参数就像一个虚拟对象,对实际的底层数据没有影响。它是一个假人,对实际数据没有影响 - 转储并使用:

"first"

绝对更方便:)

答案 1 :(得分:7)

根据您的评论,如果您希望封装此逻辑,那么您可以使用类似于下面的内容。

下面包括子和功能。该函数返回一个Person对象:

Public Sub testing()

    Dim t As Person

    Set t = PersonData("John", "Smith")

End Sub


Public Function PersonData(firstName As String, lastName As String) As Person

    Dim p As New Person

    p.firstName = firstName
    p.lastName = lastName

    Set PersonData = p

End Function

人类:

Dim pFirstName As String, pLastName As String

Public Property Let FirstName(FirstName As String)
    pFirstName = FirstName
End Property

Public Property Get FirstName() As String
    FirstName = pFirstName
End Property

Public Property Let LastName(LastName As String)
    pLastName = LastName
End Property

Public Property Get LastName() As String
    LastName = pLastName
End Property

答案 2 :(得分:2)

在类中使用Public Sub过程来执行此操作:

Public Sub testing()
Dim myPerson As New Person
myPerson.SetName "KaciRee", "Software"

End Sub

人类:

Dim pFirstName As String, pLastName As String

Public Property Let FirstName(FirstName As String)
    pFirstName = FirstName
End Property

Public Property Get FirstName() As String
    FirstName = pFirstName
End Property

Public Property Let LastName(LastName As String)
    pLastName = LastName
End Property

Public Property Get LastName() As String
    LastName = pLastName
End Property

Public Sub SetName(FirstName As String, LastName As String)
pFirstName = FirstName
pLastName = LastName
End Sub