到目前为止,我对在类模块中使用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 = ??
或者这是不可能做到的?
答案 0 :(得分:13)
我知道已经有2个解决方法,但我认为回答你原来的问题值得一试,因为这个问题的意见数量很多。
答案
是否可以在VBA中的Let属性中包含多个参数?
是
首先让我们谈谈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
的正文中,并分配Let
和first
名称 但忘记了,让我们正确地完成它......
好的,在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 Get
和one 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
哦,智能期待什么?真棒!
此时我们值得了解的是,我们的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