我在类模块到目前为止使用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 = ??
还是这只是普通的不能做?
根据你的评论,如果您希望封装这个逻辑,那么你可以使用类似于下面的东西。
下面包括子和功能。 该函数返回一个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
Person类:
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种解决方法,但我想回答你原来的问题是值得给予了一枪由于意见对这一问题的接收量。
这个问题的答案
是否有可能有多个参数在咱们物业在VBA?
是
是! 这是可能的。
首先让我们来谈谈,获取属性。 考虑这个作为Class1
Private firstName as String
Private lastName as String
Public Property Get Name() As String
Name = firstName & " " & lastName
End Property
该Name
属性将返回全名 ,这是伟大的,但如何使用Let
财产分配firstName
和lastName
一气呵成?
附注:您可以通过以特殊字符分隔的单个字符串,并将其分割身体内部Let
和分配first
和last
名字 却忘了 ,让我们得到它得当...
OK,在VBA默认Let
属性为当前的设置将采取1个参数,并将其分配给第一或最后一个名称...
就像是:
Public Property Let Name(value As String)
firstName = value
End Property
规则: Get
不带任何参数和Let
需要一个。 这是因为是非常合乎逻辑的Get
返回的潜在价值,但Let
需要,以便将其分配给它的代表数据从某处抢值。 值得在这一点上的记忆Let
通过属性分配=
签字即 myObject.Name = "IdOnKnuu"
我们知道,如果我们留在上面的规则保持一致,理论上我们应该能够一个参数来增加Get
和一个多到Let
。
让我们忘了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
。
我们为什么不试试这个:
c.Name("John") = "Smith"
嘿! 编译并运行了( 快速F5)
太好了,让我们检查的结果!
Debug.print c.Name("John")
嗯......那只能说明Smith
在立即窗口(Ctrl + G)......不正是我们所期待的....
让我们再回到Let
财产,我们注意到,我们通过参数抓2个值,但我们只利用其中的一个吗? 我们有2个不同的值进来的功能,对不对? 让我们把第一个作为firstName
,第二个为lastName
Public Property Let Name(first As String, last As String)
firstName = first
lastName = last
End Property
让我们回到Module1
Sub Main()
Dim c As New Class1
c.Name("John") = "Smith"
Debug.Print c.Name("John")
End Sub
并重新运行了当前的代码为我们提供了我们所需要的......它打印约翰·史密斯 ,但等待! 为什么我们要以检索完整名称传递的第一个名字 ?
哈! 诀窍这是为了让这两个属性的第一个参数Optional
总之,代码:
Class1.cls
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
Module1.bas
Sub Main()
Dim c As New Class1
c.Name("John") = "Smith"
Debug.Print c.Name ' prints John Smith
End Sub
所以基本上两个( 或更多 )的值通过分配Let
财产有可能在VBA。 可能让你偏离一点的东西是语法,但我希望我在这个答案的解释,帮助你明白的地方,都是从和原因。
在Get
财产有一个可选的参数 -它实际上只是一个虚参数 ......这不是内的任何地方使用Get
属性,但它使我们能够获得所需的Let
签名和允许我们两个参数传递给它。 它还授予容易记住c.Name
语法。
呼叫
Debug.Print c.Name("first")
仍然是可能的,但是"first"
参数只是就像一个虚拟的并且对实际的底层数据没有影响。 这是一个虚拟的和对实际数据没有影响 - 它倾倒和使用:
Debug.print c.Name
肯定更方便:)
作公众Sub过程在类中执行此:
Public Sub testing()
Dim myPerson As New Person
myPerson.SetName "KaciRee", "Software"
End Sub
Person类:
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
文章来源: Let property of VBA class modules - is it possible to have multiple arguments? [duplicate]