Let / Get Properties中的可选参数如何工作?

时间:2011-07-10 16:05:48

标签: vba properties optional-parameters

我在Excel 2007中使用vba,并且正在为类模块编写代码。

1)以下代码是否可行?...
基本上我有两个枚举,称为eDATASETeDATATSUBSET。来自eDATASET的特定值应触发Let属性中可选传递参数的赋值。像这样:

Public Property Let foo(Optional ByVal lngSubSet as eDATASUBSET, _  
                        ByVal lngSuperSet as eDATASET)
    Select Case lngSuperSet
        Case eDATASET.abc, eDATASET.def
            mlngBar = lngSuperSet
        Case eDATASET.xyz
            '// if lngSubSet not passed, trigger error code...
            mlngBar = lngSubSet
    End Select
End Property

2)如何在调用对象时将可选参数传递给可写属性...
除了看似向后放置Optional参数(与函数和子函数中的可选参数相比),我无法找到有关此功能的任何文档。 vba帮助说:

  

可选。表示不需要参数。如果使用,arglist中的所有后续参数也必须是可选的,并使用Optional关键字声明。请注意,Property Let表达式的右侧不可能是Optional。

以及vbusers.com中的以下内容。没有在使用方式上解释太多。那么在从代码模块调用对象时如何传递可选参数... oObj.foo = ???

3)有更好的方法吗?...
我对oop有一个基本的了解(至少在vba中是如何实现的)。有条件地将参数接受到对象中是否有更好的方法?

2 个答案:

答案 0 :(得分:13)

1)是您的代码是可能的。

2)这是你传递参数的方式:

假设myObject是您班级的一个对象:

myObject.foo(lngSubSet) = lngSuperSet 

arglist 中放置参数确实看起来很奇怪,但这对你来说是VBA。假设您有4个参数,其中两个是可选的,另外还有您的右侧。你可以这样放置它们:

Public Property Let foo(arg1, arg2, Optional arg3, Optional arg4, _  
                        RHS)

并像这样使用它们(假设您选择退出arg4):

myObject.foo(arg1,arg2,arg3) = RHS

3)有更好的方法吗?根据您的要求,始终存在。您可以将lngSubSet参数完全作为单独的属性。这就是我倾向于这样做的方式。但在你的情况下,你的做事方式可能适合你。我不知道,这在很大程度上是一个品味问题,取决于你的具体应用。

答案 1 :(得分:0)

该问题被标记为一个完全不同的问题的答案,“ VBA类模块的属性-可能有多个参数吗?[重复]”,因此可能有人想要该问题的答案链接,然后在这里结束。

该问题已经结束,因此我在这里给出答案:是的,可以使用多个参数,如文档中所述:https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/property-let-statement

您使用ParamArray声明。