【问题标题】:How to test if some of the optional parameters of an excel-VBA procedure is supplied?如何测试是否提供了 excel-VBA 过程的某些可选参数?
【发布时间】:2013-06-14 00:46:50
【问题描述】:

我正在尝试使用用户输入编写一个 VBA 宏来自动筛选表。我需要用户指明要过滤的列以及该字段的条件。因此,我想定义一个带有多个可选参数(参数)的 Sub 来获取用户的偏好。我的问题是如何检查是否提供了可选参数?

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

感谢您的回复。

【问题讨论】:

标签: vba excel optional-parameters autofilter


【解决方案1】:

一种可能性是指定一个荒谬的默认值。然后与默认比较。

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 来解决这个问题,并允许用户制作变量这将用于过滤,但有没有办法在没有表单的代码中做到这一点?
  • 我刚刚尝试回答最初的问题。我不太确定我明白你现在在问什么。 预期的变量数是什么意思?这是您写的Sub,还是与工作簿、工作表或其他内容有关?
【解决方案2】:

如果变量的类型是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

【讨论】:

  • 这是唯一适用于可选变体的答案,当您需要宏在 F8 菜单中可见时,这是必需的。这也是更正确的答案,因为它不需要设置默认值。
猜你喜欢
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多