我们的VBA类模块的属性 - 是有可能有多个参数? [重复](Let property of V

2019-07-04 23:00发布

这个问题已经在这里有一个答案:

  • 如何在咱们可选参数/获取属性的工作? 1个回答

我在类模块到目前为止使用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 = ??

还是这只是普通的不能做?

Answer 1:

根据你的评论,如果您希望封装这个逻辑,那么你可以使用类似于下面的东西。

下面包括子和功能。 该函数返回一个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


Answer 2:

我知道目前已经有2种解决方法,但我想回答你原来的问题是值得给予了一枪由于意见对这一问题的接收量。

这个问题的答案

是否有可能有多个参数在咱们物业在VBA?

是! 这是可能的。

首先让我们来谈谈,获取属性。 考虑这个作为Class1

Private firstName as String
Private lastName as String

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

Name属性将返回全名 ,这是伟大的,但如何使用Let财产分配firstNamelastName一气呵成?

附注:您可以通过以特殊字符分隔的单个字符串,并将其分割身体内部Let和分配firstlast名字 却忘了 ,让我们得到它得当...

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

肯定更方便:)



Answer 3:

作公众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]