我在MS Access的VBA脚本中有一个私有过程:
Private Sub drawLineDiagram(chartSpace As Variant, title As String, caption As String, x_val() As Variant, y_val() As Variant, Optional y_val2() As Variant = ????)
如您所见,我希望为值数组提供可选的最后一个参数。
我必须指定哪种默认参数?如果我用一个可选的整数值来做,并指定它,例如0一切都很好。
如果我使用如上所示的数组并指定一个数组,则该行标记为红色=>作为错误(它不会编译)。
答案 0 :(得分:11)
如果您需要VBA中的可选数组,请将其声明为Variant
而不指定数组,但无论如何都要将其作为数组访问。通过这种方式,您可以得到Variant
(单个变量),其中包含Variant
个数组,而不仅仅是Variant
个数组。不需要默认值:
Private Sub drawLineDiagram(chartSpace As Variant, title As String, caption As String, x_val As Variant, y_val As Variant, Optional y_val2 As Variant)
为了保持一致性,还要将其他两个参数声明为普通Variant
。
如果您讨厌IDE,请不要使用它。 使用记事本。然后粘贴书面代码。
答案 1 :(得分:5)
也许你想要一个参数数组:
在程序声明中,定义 正常方式的参数列表。 除最后一个之外的所有参数 必须要求(不是可选的(视觉 基本))。
使用前面的最后一个参数名称 关键字ByVal ParamArray。这个 参数是自动可选的。 请勿包含Optional关键字。
- How to: Overload a Procedure that Takes an Indefinite Number of Parameters (Visual Basic)
答案 2 :(得分:1)
IDE可能用处不大,但帮助(一次)包含答案:
的的ParamArray 强>
可选的。仅用作arglist中的最后一个参数,以指示最终参数是Variant元素的Optional数组。 ParamArray关键字允许您提供任意数量的参数。 ParamArray不能与ByVal,ByRef或Optional一起使用。
答案 3 :(得分:1)
有一个更简单但不一定更好的答案。塞巴斯蒂安说:“如果我使用上面显示的数组进行操作并分配一个数组,该行将被标记为红色=>作为错误(并且不会编译)。”
您的代码包括“ Optional y_val2()As Variant = ????”。您不需要那里的“()”即可将Variant数组用作参数。因此,如果您真的想那样做,可以例如使用“ Optional y_val2 = FALSE”之类的东西。
最初传递参数时,如果要传递数组,只需确保那个是Variant数组。
我确实认为不使用默认值更为优雅,因此我总体上同意GSerg的回答(并支持该问题和原始问题)。
对于GSerg和spinjector,是的,您可以使用“ If IsArray(YourOptionalVariantParameter)Then”检查可选参数,但是如果使用的是Variant, “ IsMissing(YourOptionalVariantParameter)方便且优雅,可能更快一些,可以在(仅当)将Variant作为参数传递时使用,以检查其是否存在。< / p>
如果执行“ IsArray(YourOptionalVariantParameter)”并且不存在此类参数,那么我们要做的就是检查不存在的变量是否为数组。如果您使用默认参数值,例如FALSE(如我的第一个示例),则首先检查变量是否为数组确实很有意义。
顺便说一句,我不同意您需要将所有参数声明为Variants以获得一致性。变体的效率不如其他类型,因此我认为仅在必要时使用。