【问题标题】:Optional Range to Sub Excel VBASub Excel VBA的可选范围
【发布时间】:2020-07-14 19:24:14
【问题描述】:

我有一个现有的宏,我想通过传递 rng 参数来使用,但如果没有传递 rng,宏会通过输入框请求 rng,但我无法让参数正常工作。

这是我所拥有的:

Sub Four_Hundred_Fourty_Four_Split_Sub(Optional urng)
     ' Tried (Optional urng As Range), but it didn't work, couldn't run sub without arg

If IsEmpty(urng) = False Then 'urng = Missing
    Debug.Print urng
    Set urng = Application.InputBox("Select a range", "Obtain Range Object", Type:=8)
End If

如何让可选的 rng 参数在此方法中起作用?

【问题讨论】:

  • 您将不得不将该输入框作为字符串抓取。然后使用该字符串设置 Range 变量。但是,在尝试之前可能需要测试字符串的有效性。
  • 试试If urng Is Nothing Then

标签: excel vba range


【解决方案1】:

在过程中使用可选参数时,需要使用IsMissing

Sub Four_Hundred_Fourty_Four_Split_Sub(Optional urng)
    If IsMissing(urng) Then
        Set urng = Application.InputBox("Select a range", "Obtain Range Object", Type:=8)
    End If
End Sub

问候,

【讨论】:

  • urng 使用此方法作为Variant 传递。这可能会引入使用As Range 可以轻松避免的错误
  • @ProfoundlyOblivious IsMissing 仅在 Variant 的上下文中才有意义。其他数据类型总是False
  • 请注意,如果用户按下取消,Application.InputBox 将返回Variant/False,并且不能与Set 一起使用。如果您删除Set,那么当用户确实选择了一个范围时,它将被强制转换为 Variant 数组。要解决此问题,请参阅 stackoverflow.com/a/36898101/11683
【解决方案2】:

将范围变量与空值进行比较:

Sub test(Optional urng As Range)
    If urng Is Nothing Then
        Set urng = Application.InputBox("Select a range", "Obtain Range Object", Type:=8)
    End If
    Debug.Print urng.Address
End Sub

按预期工作。

【讨论】:

  • 那么没有办法区分testtest Nothing
  • @GSerg 好点——但如果明确传递Nothing,向用户询问范围似乎是所需的行为。
  • 当我使用Optional urng As Range 时,如果不传递urng,我将无法运行宏
  • @FreeSoftwareServers 因为你最后还需要= Nothing
  • 我在网上找到了,试过了,不传arg还是不能运行宏。使用IsMissing 效果很好。我觉得很愚蠢,因为我使用了调试,它告诉我urng = Missing 而我没想到要测试IsMissing 哈哈。我确实尝试过If urng = missing,但没有奏效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
相关资源
最近更新 更多