14

我在 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 一切都很好。

如果我使用如上所示的数组并分配一个数组,则该行被标记为红色 => 为错误(并且它不会编译)。

4

4 回答 4

18

如果您需要 VBA 中的可选数组,请将其声明为Variant不带数组说明符,但无论如何都要将其作为数组访问。通过这种方式,您将获得一个Variant(单个变量),其中包含一个Variants 数组,而不仅仅是Variants 数组。不需要默认值:

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为了保持一致性,还将其他两个参数声明为 plain 。

如果您讨厌 IDE,请不要使用它。使用记事本。然后粘贴写好的代码。

于 2010-02-15T11:30:52.627 回答
5

也许你想要一个参数数组:

在过程声明中,以正常方式定义参数列表。除了最后一个参数之外的所有参数都必须是必需的(不是可选的 (Visual Basic))。

在最后一个参数名称之前加上关键字 ByVal ParamArray。此参数是自动可选的。不要包含 Optional 关键字。

--如何:重载采用不定数量参数的过程 (Visual Basic)

VBA 参考:了解参数数组

于 2010-02-15T11:38:05.407 回答
2

这个问题有一个更简单但不一定更好的答案。Sebastian 说:“如果我使用如上所示的数组并分配一个数组,则该行将标记为红色 => 为错误(并且不会编译)。”

您的代码包括“可选 y_val2() As Variant = ????”。您不需要那里的“()”来将 Variant 数组作为参数。因此,如果您真的想这样做,您可以使用诸如“可选 y_val2 = FALSE”之类的东西。

最初传递参数时,如果你想传递一个数组,那么只需确保它一个 Variant 数组。

我确实认为不在那里使用默认值会更优雅,所以我一般同意 GSerg 的回答(并赞成这个问题和原始问题)。

但是对于 GSerg 和 spinjector,是的,您可以使用“If IsArray(YourOptionalVariantParameter) Then”来检查可选参数,但如果您使用的是 Variant,“ IsMissing (YourOptionalVariantParameter)”很方便且优雅,可能会更快一点,并且可以在(且仅当)将 Variant 作为参数传递时使用,以检查它是否存在。

如果您执行“IsArray(YourOptionalVariantParameter)”并且不存在这样的参数,那么我们所做的就是检查不存在的变量是否是数组。如果您使用 FALSE 之类的默认参数值(如在我的第一个示例中),那么首先检查变量是否为数组是有意义的。

顺便说一句,我不同意您需要将所有参数声明为 Variants 以保持一致性。我认为,变体的效率低于其他类型,因此应仅在必要时使用。

于 2019-12-06T17:05:20.130 回答
1

IDE 可能用处不大,但帮助(一次)包含答案:
ParamArray
Optional。仅用作 arglist 中的最后一个参数,以指示最后一个参数是 Variant 元素的可选数组。ParamArray 关键字允许您提供任意数量的参数。ParamArray 不能与 ByVal、ByRef 或 Optional 一起使用。

于 2010-02-15T11:35:12.757 回答