Har*_*don 12 vba properties optional-parameters
我在Excel 2007中使用vba,并且正在为类模块编写代码.
1)以下代码是否可能?...
基本上我有两个枚举,称之为eDATASET
和eDATATSUBSET
.特定值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
论点完全作为一个单独的财产.这就是我倾向于这样做的方式.但在你的情况下,你的做事方式可能适合你.我不知道,这在很大程度上是一个品味问题,取决于你的具体应用.