处理InputBox的取消以选择范围

Jer*_*ton 8 error-handling excel vba excel-vba inputbox

我有以下代码:

dim selectRange as Range
Set selectRange = Application.InputBox("Select your range", "Hello", , , , , , 8)
Run Code Online (Sandbox Code Playgroud)

当用户选择取消InputBox提示时,它将返回error of Object not set.

我试图使用Variant变量类型但我无法处理它.在取消的情况下,它返回False,同时在选择范围的情况下,它返回InputBox的范围.

我怎样才能避免这个错误?

Net*_*loh 8

使用输入框选择范围时,这是一个问题.Excel在返回范围之前返回错误,并在您按取消时执行此错误.

因此,您应该主动处理此错误.如果您在按取消时不希望发生任何事情,您可以使用如下代码:

Sub SetRange()
    Dim selectRange As Range

    On Error Resume Next
        Set selectRange = Application.InputBox("Select your range", "Hello", , , , , , 8)
    Err.Clear
    On Error GoTo 0
End Sub 
Run Code Online (Sandbox Code Playgroud)


Dir*_*hel 6

虽然这个问题有点老了,但我还是想展示正确的方法来做到这一点而不会出错.你可以通过函数或子函数来实现它.

你的主要程序是这样的:

Sub test()
  Dim MyRange As Range

  testSub Application.InputBox("dada", , , , , , , 8), MyRange 'doing via Sub
  Set MyRange = testFunc(Application.InputBox("dada", , , , , , , 8)) ' doing via function

  If MyRange Is Nothing Then
    Debug.Print "The InputBox has been canceled."
  Else
    Debug.Print "The range " & MyRange.Address & " was selected."
  End If
End Sub
Run Code Online (Sandbox Code Playgroud)

往来港澳(搞笑)将是:

Sub testSub(ByVal a As Variant, ByRef b As Range)
  If TypeOf a Is Range Then Set b = a
End Sub
Run Code Online (Sandbox Code Playgroud)

功能将如下所示:

Function testFunc(ByVal a As Variant) As Range
  If TypeOf a Is Range Then Set testFunc = a
End Function
Run Code Online (Sandbox Code Playgroud)

现在只需使用您喜欢的方式并删除未使用的行.

如果调用sub或函数,则不需要Set参数.也就是说,InputBox返回一个对象并不重要.您需要做的就是检查参数是否是您想要的对象,然后根据它进行操作.

编辑

另一种聪明的方法是使用与此类似的集合使用相同的行为:

Sub test()
  Dim MyRange As Range
  Dim MyCol As New Collection

  MyCol.Add Application.InputBox("dada", , , , , , , 8)
  If TypeOf MyCol(1) Is Range Then Set MyRange = MyCol(1)
  Set MyCol = New Collection

  If MyRange Is Nothing Then
    Debug.Print "The inputbox has been canceled"
  Else
    Debug.Print "the range " & MyRange.Address & " was selected"
  End If
End Sub
Run Code Online (Sandbox Code Playgroud)

如果您还有任何疑问,请询问;)


Ray*_*ian 5

我在这里参加派对已经迟到了,但这是我能找到的唯一一个解释为什么我只是在检查我的变量时遇到麻烦的地方.如接受的答案中所述vbCancel,范围对象的处理方式与字符串对象的处理方式不同.错误必须有错误处理程序捕获.

讨厌错误处理程序.所以我将它隔离到自己的功能

Private Function GetUserInputRange() As Range
    'This is segregated because of how excel handles cancelling a range input
    Dim userAnswer As Range
    On Error GoTo inputerror
    Set userAnswer = Application.InputBox("Please select a single column to parse", "Column Parser", Type:=8)
    Set GetUserInputRange = userAnswer
    Exit Function
inputerror:
    Set GetUserInputRange = Nothing
End Function
Run Code Online (Sandbox Code Playgroud)

现在在我的主要内容我可以

dim someRange as range
set someRange = GetUserInputRange
if someRange is Nothing Then Exit Sub
Run Code Online (Sandbox Code Playgroud)

无论如何,这与接受的答案不同,因为它允许用户仅使用特定的错误处理程序处理此错误,而不需要resume next或者以相同的方式处理其余的过程.如果有人像我一样在这里结束.