VBA子程序可选参数与默认值

5

我正在尝试编写一个允许使用默认值的可选参数的 VBA 子程序。我尝试了来自 Microsoft Docs - 可选参数 (Visual Basic) 的示例代码,但这导致该子程序在可用子程序列表中不显示(即从“查看宏”中)。

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 声明,但无法显示出来的内容是:

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 逻辑 进行解决:

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. 如何使其出现在“查看宏”列表中?

环境:

  • Word 2016 x64
  • Windows 10

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


2
只有没有参数的公共子程序才能在“查看宏”中看到。创建一个没有参数的子程序,该子程序将调用此子程序(一旦在VBA中正确编写)。 - Kostas K.
我的当前版本有许多参数,可以在“查看宏”列表中看到(每个操作员): 子突出显示字体(可选 ByVal highlightFont As Variant,...) - kaanchan
3个回答

6
您提供的链接是VB.Net的帮助页面,而非VBA。虽然VBA和VB.Net相似,但用途完全不同。VBA是Microsoft Office应用程序内置脚本语言。VB.Net是一种完整的.Net语言,其根源于VBA,但除非您编写特定的VSTO插件或应用程序,否则Office应用程序不使用它。
在VBA中,可选参数可以正常工作。您提供的代码示例的VBA版本如下:
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是更好的选择,因为提供合理的默认值并不可能。


我已经更新了示例代码并添加了换行符(这是一个很好的提示,谢谢)。看起来VB.net和VBA代码几乎相同,除了Debug.WriteLine被替换为Debug.print。 - kaanchan

4

可选值参数声明

是的,带有默认值的可选参数仍然可以在 Word 2016 中使用。VBA 参考 表示:

arglist 参数具有以下语法和部分:

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

Optional 可选。指示参数不是必需的 关键字。如果使用,arglist 中的所有后续参数也必须是可选的,并且必须使用 Optional 关键字进行声明。如果使用了 ParamArray,则不能对任何参数使用 Optional

defaultvalue 可选。任何常量或常量表达式。仅适用于Optional参数。如果类型为 Object,则显式默认值只能为 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

声明具有默认值的参数时,出现意外的界面行为是子过程将不再出现在宏列表中

Note sub examples 1, 3 show. 2, 4, 5 do not.

这不应被解释为子程序有问题或不能用。

  • 可以理解的是,似乎是一种设计决策,需要从另一个子程序或即时窗口1中调用带参数的子程序,因此它们不会显示在宏列表中。 enter image description here
  • 逻辑上,只有/全部可选参数的子程序(而没有默认值会显示2在宏列表中,因为根据定义,调用不需要提供显式参数
  • 不一致地,提供了可选参数默认值的子程序不会显示在宏列表中

调用选项

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

  1. 声明一个无参数的调用子程序来调用相应的子程序。这个调用子程序将出现在宏列表中。
    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

Caller sub shows in Macros list

  1. 使用即时窗口1调用相关的子程序

1开发人员 - Visual Basic - 查看 - 即时窗口 (Ctrl+G)

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


0
尽管在宏列表中看不到带有所有参数可选的Sub,但你可以输入该Sub的名称,然后..哇啊:运行按钮自动启用,Sub就可以运行了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接