VBA 具有默认值的子可选参数

VBA Sub optional parameters with default values

我正在尝试编写一个 VBA 子程序,它允许可选参数 具有默认值 。我尝试了 Microsoft Docs - Optional Parameters (Visual Basic) 中的示例代码,但它导致子未显示在可用子列表中(即来自 View Macros)。

Sub notify(ByVal company As String, Optional ByVal office As String = "QJZ")
    If office = "QJZ" Then
        Debug.WriteLine("office not supplied -- using Headquarters")
        office = "Headquarters"
    End If
    ' Insert code to notify headquarters or specified office.
End Sub

我试过但无法出现的子声明是:

Sub HighlightByFont( _
        Optional ByVal highlightFont As Variant = "", _
        Optional ByVal highlightColor As Variant = "", _
        Optional ByVal highlightText As Variant = "", _
        Optional ByVal matchWildcards As Variant = False, _
        Optional ByVal useGUI As Variant = False, _
        Optional ByVal highlightBold As Variant = False, _
        Optional ByVal highlightItalic As Variant = False)

现在,我不得不满足于以下 :

Sub HighlightByFont( _
        Optional ByVal highlightFont As Variant, _
        Optional ByVal highlightColor As Variant, _
        Optional ByVal highlightText As Variant, _
        Optional ByVal matchWildcards As Variant, _
        Optional ByVal useGUI As Variant, _
        Optional ByVal highlightBold As Variant, _
        Optional ByVal highlightItalic As Variant)

是否(仍然)可能,如果可能,如何:

  1. 要设置参数声明?
  2. 让它出现在“查看宏”列表中?

环境:

所有参考资料,包括与 VBA 可选参数相关的 SO 答案均来自 2015 年。

您提供的 link 是 VB Net and Not VBA 的帮助页面。 VBA 和 VB.Net 相似,但用例却截然不同。 VBA 是 Microsoft Office 应用程序使用的内置脚本语言。 VB Net 是一种完整的 .Net 语言,它起源于 VBA,但除非您编写特定的 VSTO 插件或应用程序,否则 Office 应用程序不会使用它。

VBA 中的可选参数工作正常。 VB您在上面提供的代码示例的一个版本是。

Sub notify(ByVal company As String, Optional ByVal office As String = "QJZ")
    If office = "QJZ" Then
        Debug.print "office not supplied -- using Headquarters"
        office = "Headquarters"
    End If
    ' Insert code to notify headquarters or specified office.
End Sub

你也可以帮我们一个忙,学会使用换行符,这样

Sub HighlightByFont(Optional ByVal highlightFont As Variant = "", Optional ByVal highlightColor As Variant = "", Optional ByVal highlightText As Variant = "", Optional ByVal matchWildcards As Variant = False, Optional ByVal useGUI As Variant = False, Optional ByVal highlightBold As Variant = False, Optional ByVal highlightItalic As Variant = False)

写成

Sub HighlightByFont _
( _
    Optional ByVal highlightFont As Variant = "", _
    Optional ByVal highlightColor As Variant = "", _
    Optional ByVal highlightText As Variant = "", _
    Optional ByVal matchWildcards As Variant = False, _
    Optional ByVal useGUI As Variant = False, _
    Optional ByVal highlightBold As Variant = False, _
    Optional ByVal highlightItalic As Variant = False _
)

您还应该知道,任何使用默认值定义的可选参数都不能丢失,有时 IsMissing 是更好的选择,因为它不可能提供合理的默认值。

可选值参数声明

是的,具有默认值的可选参数在 Word 2016 之前仍然有效。VBA reference 声明:

The arglist argument has the following syntax and parts:

[ Optional ] [ ByVal | ByRef ] [ ParamArray ] varname [ ( ) ] [ As type ] [ = defaultvalue ]

Optional Optional. Keyword indicating that an argument is not required. If used, all subsequent arguments in arglist must also be optional and declared by using the Optional keyword. Optional can't be used for any argument if ParamArray is used.

defaultvalue Optional. Any constant or constant expression. Valid for Optional parameters only. If the type is an Object, an explicit default value can only be Nothing.

Sub OptParam_Test_1()
  'Shows in Macro list
End Sub

Sub OptParam_Test_2(param)
  'Does not show in Macro list
    Debug.Print (param) 'Output for OptParam_Test_2 "hello": hello
End Sub

Sub OptParam_Test_3(Optional param)
  'Shows in Macro list
    Debug.Print (param) 'Output: hello
End Sub

Sub OptParam_Test_4(Optional param As String = "hello")
  'Does not show in Macro list
    Debug.Print (param) 'Output: hello
End Sub

Sub OptParam_Test_5(Optional param As Variant = "hello again")
  'Does not show in Macro list
    Debug.Print (param) 'Output: hello again
End Sub

使用默认值声明参数时的意外接口行为是子程序将停止出现在宏列表中

这不应被解释为潜艇有问题或无法使用。

  • 可以理解,这似乎是一个设计决定,需要从另一个子程序或立即 window1 调用带有参数的子程序,因此不需要在宏列表中显示
  • 逻辑上,带有 only/all 可选参数的 subs(没有默认值显示 2 在宏列表中,因为根据定义,调用不需要提供显式参数
  • 不一致,带有可选参数的潜艇提供默认值在宏列表中显示

调用选项

调用包含默认值参数的子程序的两个选项是:

  1. 声明一个无参数的调用 sub,它调用有问题的 sub。 这个调用子将出现在宏列表中。
    Sub OptParam_Test_4(Optional param As String = "hello")
      'Does not show in Macro list
        Debug.Print (param) 'Output: hello
    End Sub

    Sub OptParam_Test_4_()
      'Shows in Macro list
      OptParam_Test_4
      'Output: hello
    End Sub

  1. 使用即时 window1 调用有问题的子

1开发人员 - Visual Basic - 查看 - 立即 Window (Ctrl+G)

2与与该主题相关的多个 SO 帖子的各种评论相反