我在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
2)如何在调用对象时将可选参数传递给可写属性...
除了看似向后放置Optional
参数(与函数和子函数中的可选参数相比),我无法找到有关此功能的任何文档。 vba帮助说:
可选。表示不需要参数。如果使用,arglist中的所有后续参数也必须是可选的,并使用Optional关键字声明。请注意,Property Let表达式的右侧不可能是Optional。
以及vbusers.com中的以下内容。没有在使用方式上解释太多。那么在从代码模块调用对象时如何传递可选参数... oObj.foo = ???
3)有更好的方法吗?...
我对oop有一个基本的了解(至少在vba中是如何实现的)。有条件地将参数接受到对象中是否有更好的方法?
答案 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声明。