如何测试Excel-VBA过程的一些可选参数是否已提供?

3
我正在尝试编写一个VBA宏,使用用户的输入来自动筛选表格。我需要用户指定要筛选的列以及该字段的条件。因此,我想定义一个带有多个可选参数的子程序来接受用户的偏好。我的问题是如何检查是否提供了可选参数?
我知道可以为每个参数编写一个测试,然后为每个可能的选项编写一个条件语句。但这似乎不是一个明智的方法,我想知道是否有人能提出解决方案。我应该说,在开始时,我们不知道我们期望从用户那里收到多少参数。
谢谢您的回复。

可能是重复的问题:VB - 如何测试可选参数是否已提供? - J. Chomel
2个回答

4
如果变量的类型是variant,解决方案是使用IsMissing
 If IsMissing(arg) Then
     MsgBox "missing parameter"
 End If

如果你期望的是 stringnumber,只需检查该值:

 Function func (Optional s as String, Optional n as Integer)

 If s = "" Then
     MsgBox "s is missing"
 End If

 If n = 0 Then
     MsgBox "n is missing"
 End

1
这是唯一适用于可选变量的答案,当您需要在F8菜单中看到宏时,则为必需。这也是更正确的答案,因为它不需要设置默认值。 - HackSlash

0
一种可能的方法是指定一个荒谬的默认值,然后与默认值进行比较。
Sub xyz( Optional p1 As String = "default_impossible_value")
    If p1 = "default_impossible_value" Then
       MsgBox "there_is_no_value_for_param_1"
    End If
End Sub

然后将其扩展为您希望作为条目的任意数量的参数:
Sub xyz( Optional p1 As String = "default_impossible_value"_
        ,Optional p2 As String = "default_impossible_value"_
        ,Optional p3 As String = "default_impossible_value"_
...
)
    If p1 = "default_impossible_value" Then
       MsgBox "there_is_no_value_for_param_1"
    End If
    If p2 = "default_impossible_value" Then
       MsgBox "there_is_no_value_for_param_2"
    End If
    If p3 = "default_impossible_value" Then
       MsgBox "there_is_no_value_for_param_3"
    End If
....
End Sub

非常感谢您的评论,这段代码非常有用。我的问题是如何知道可能/不可能提供的预期变量数量。我尝试避免使用大量变量(列和过滤器类型的组合)作为P1、P2、P3等。我知道可以通过使用VBA表单作为GUI并允许用户制定用于过滤的变量来解决此问题,但是否有一种在没有表单的情况下进行编码的方法? - M.T
我刚试着回答了最初的问题。但我不太确定我现在理解你的问题。你所说的“预期变量数”是什么意思?这是你写的一个子程序吗,还是与工作簿、工作表或其他任何东西有关? - J. Chomel

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