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


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

1)以下代码是否可能?...
基本上我有两个枚举,称之为 eDATASET 和 eDATATSUBSET。来自的特定价值 eDATASET 应该从a中的可选传递参数触发赋值 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中实现)。有条件地将参数接受到对象中是否有更好的方法?


1287
2017-07-10 16:05


起源

可能重复 让VBA类模块的属性 - 是否可以有多个参数?


答案:


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 论证完全是一个单独的财产。这就是我倾向于这样做的方式。但在你的情况下,你的做事方式可能适合你。我不知道,这主要是品味问题,取决于您的具体应用。


12
2017-07-10 19:22



万一你想知道+++ 这里 和 这里
哈!是的,我确实想知道地球上到底发生了什么。 - Jean-François Corbett