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

Har*_*don 12 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Jea*_*ett 13

1)是的,您的代码是可能的.

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

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

myObject.foo(lngSubSet) = lngSuperSet 
Run Code Online (Sandbox Code Playgroud)

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

Public Property Let foo(arg1, arg2, Optional arg3, Optional arg4, _  
                        RHS)
Run Code Online (Sandbox Code Playgroud)

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

myObject.foo(arg1,arg2,arg3) = RHS
Run Code Online (Sandbox Code Playgroud)

3)有更好的方法吗?根据你的要求,总会有.你可以把你的lngSubSet论点完全作为一个单独的财产.这就是我倾向于这样做的方式.但在你的情况下,你的做事方式可能适合你.我不知道,这在很大程度上是一个品味问题,取决于你的具体应用.

  • 万一你想知道+++ [这里](http://stackoverflow.com/questions/13823367/let-property-of-vba-class-modules-is-it-possible-to-have-multiple-arguments/26488170#26488170)和[here](http://chat.stackexchange.com/rooms/14929/vba) (2认同)
  • 哈!是的,我确实想知道地球上到底发生了什么. (2认同)