Vba 边缘案例在IsNumeric中-这是过度思考吗

Vba 边缘案例在IsNumeric中-这是过度思考吗,vba,excel,Vba,Excel,我有如下代码: Select Case IsNumeric(somevariable) Case True Resume Next Case False Call notnum Else Call MyErrorHandler End Select 这是不是想得太多了?IsNumeric是否有可能在此处返回除True或False以外的内容,或者这是一种糟糕的编程做法?不需要else,因为它将是True或False。不过,请

我有如下代码:

Select Case IsNumeric(somevariable)
    Case True
        Resume Next
    Case False
        Call notnum
    Else
        Call MyErrorHandler
End Select

这是不是想得太多了?IsNumeric是否有可能在此处返回除True或False以外的内容,或者这是一种糟糕的编程做法?

不需要else,因为它将是True或False。不过,请注意,else应该是Case else(尽管在您即将删除它时没有意义)

基于此,我不会仅对两个选项使用案例:

If IsNumeric(somevariable) then
    Resume Next
Else
    Call MyErrorHandler
End if
编辑:以下是错误检查的工作原理:

Sub SheetError()
    Dim MySheet As String
    On Error GoTo ErrorCheck
    MySheet = ActiveSheet.name
    Sheets.Add
    ActiveSheet.name = MySheet
    MsgBox "I continued the code"
    ActiveSheet.name = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    MsgBox "I will never get to here in the code"
    End
ErrorCheck:
    If Err.Description = "Cannot rename a sheet to the same name as another sheet, a referenced object library or a workbook referenced by Visual Basic." Then
        Resume Next
    Else
        MsgBox "Error I am not designed to deal with"
    End If
End Sub

将此模块复制并粘贴到您的个人工作簿或新工作簿中,然后运行它,使用F8逐行查看它实际上是如何处理错误的。

不需要else,因为它将为真或假。不过,只需注意else应为Case else(尽管在您即将删除它时没有意义)

基于此,我不会仅对两个选项使用案例:

If IsNumeric(somevariable) then
    Resume Next
Else
    Call MyErrorHandler
End if
编辑:以下是错误检查的工作原理:

Sub SheetError()
    Dim MySheet As String
    On Error GoTo ErrorCheck
    MySheet = ActiveSheet.name
    Sheets.Add
    ActiveSheet.name = MySheet
    MsgBox "I continued the code"
    ActiveSheet.name = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    MsgBox "I will never get to here in the code"
    End
ErrorCheck:
    If Err.Description = "Cannot rename a sheet to the same name as another sheet, a referenced object library or a workbook referenced by Visual Basic." Then
        Resume Next
    Else
        MsgBox "Error I am not designed to deal with"
    End If
End Sub
将此模块复制并粘贴到您的个人工作簿或新工作簿中,然后运行它,使用F8逐行查看它实际如何处理错误。

根据OP的评论,我没有使用错误处理程序。我想做一些有希望的数字输出

或者,如果您想一直提示输入数字,直到用户正确输入或取消输入

Sub demo2()
    Dim inputs As Variant

    Do
        inputs = InputBox("Enter something Numeric", "Title", "Default")

    Loop Until IsNumeric(inputs) Or inputs = vbNullString
    If Not inputs = vbNullString Then
        ' Do wht you want with numeric input inside the Else
    End If

    ' Maybe do more stuff irrespective of input

End Sub
根据OP的评论,我没有使用我的错误处理程序。我想做一些有希望的数字输出

或者,如果您想一直提示输入数字,直到用户正确输入或取消输入

Sub demo2()
    Dim inputs As Variant

    Do
        inputs = InputBox("Enter something Numeric", "Title", "Default")

    Loop Until IsNumeric(inputs) Or inputs = vbNullString
    If Not inputs = vbNullString Then
        ' Do wht you want with numeric input inside the Else
    End If

    ' Maybe do more stuff irrespective of input

End Sub

输入框可以有不同类型的输入验证。试试这个

something = Application.InputBox("Pls Insert the Number", Type:=1)
If something = False Then Exit Sub
'Type:=0 A formula
'Type:=1 A number
'Type:=2 Text (a string)
'Type:=4 A logical value (True or False)
'Type:=8 A cell reference, as a Range object
'Type:=16 An error value, such as #N/A
'Type:=64 An array of values

输入框可以有不同类型的输入验证。试试这个

something = Application.InputBox("Pls Insert the Number", Type:=1)
If something = False Then Exit Sub
'Type:=0 A formula
'Type:=1 A number
'Type:=2 Text (a string)
'Type:=4 A logical value (True or False)
'Type:=8 A cell reference, as a Range object
'Type:=16 An error value, such as #N/A
'Type:=64 An array of values

isnumeric将仅返回布尔值。isnumeric从不发出error@ThomasShera使用
继续下一步
是不合适的。看我的answer@Nick.McDermaid这当然是人为的,但这个例子的要点是,对
IsNumeric
的调用至少可能会触发错误,因此最不可能的是,这样的调用可能需要嵌入到错误处理程序中。是的,但那里没有错误处理程序,只是一个错误混淆器:)isnumeric将只返回布尔值。isnumeric从不发出error@ThomasShera使用
继续下一步
是不合适的。看我的answer@Nick.McDermaid这当然是人为的,但这个例子的要点是,对
IsNumeric
的调用至少可能会触发错误,因此最不可能的是,这样的调用可能需要嵌入到错误处理程序中。是的,但那里没有错误处理程序,只是一个错误混淆器:)所以我们在开始lol的地方结束了,我在这两个问题上,甚至没有意识到是同一个人。@DanDonoghue非常感谢,我仔细阅读了代码,我不知道关于将工作表重命名为与另一个工作表同名的小道消息。所以我们在开始lol的地方结束了,我对这两个问题都很了解,甚至没有意识到是同一个人。@DanDonoghue非常感谢,我仔细阅读了代码,我不知道用另一张表的名称重命名该表的小贴士。