如何测试是否提供了excel VBA过程的某些可选参数?

如何测试是否提供了excel VBA过程的某些可选参数?,vba,excel,optional-parameters,autofilter,Vba,Excel,Optional Parameters,Autofilter,我正在尝试编写一个VBA宏,以使用用户输入自动筛选表。我需要用户指示要筛选的列以及该字段的条件。因此,我想定义一个具有多个可选参数(参数)的子对象,以满足用户的偏好。我的问题是如何检查是否提供了可选参数 我知道我可以为每个参数编写一个测试,然后为每个可能的选项编写一个条件语句。但这似乎不是一个明智的方式,我想知道是否有人可以提出一个解决方案。我应该说,在一开始,我们不知道我们期望从用户那里收到多少个参数 谢谢你的回复 一种可能是指定荒谬的违约。然后与默认值进行比较 Sub xyz( Option

我正在尝试编写一个VBA宏,以使用用户输入自动筛选表。我需要用户指示要筛选的列以及该字段的条件。因此,我想定义一个具有多个可选参数(参数)的子对象,以满足用户的偏好。我的问题是如何检查是否提供了可选参数

我知道我可以为每个参数编写一个测试,然后为每个可能的选项编写一个条件语句。但这似乎不是一个明智的方式,我想知道是否有人可以提出一个解决方案。我应该说,在一开始,我们不知道我们期望从用户那里收到多少个参数


谢谢你的回复

一种可能是指定荒谬的违约。然后与默认值进行比较

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

如果变量类型为
variant
,则解决方案是使用
IsMissing

 If IsMissing(arg) Then
     MsgBox "missing parameter"
 End If
然后,如果需要
字符串
数字
,只需检查值:

 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

非常感谢您的评论,非常有用的一段代码。我的问题是如何知道可能/可能未提供的变量的预期数量。我尽量避免使用大量变量(列和过滤器类型的组合),如P1、P2、P3、,…我知道我可以通过使用VBA表单作为GUI来解决这个问题,并允许用户生成用于筛选的变量,但是否有某种方法可以在没有表单的代码中完成此操作?我只是尝试回答了最初的问题。我不太确定我是否理解你现在的要求。你所期望的变量数量是什么意思?这是您编写的
Sub
,还是与工作簿、工作表或其他内容有关?这是唯一一个可选变量的答案,当您需要宏在F8菜单中可见时,需要该变量。这也是更正确的答案,因为它不需要设置默认值。