IsNumeric 中的边缘案例 - 这是否想多了

Posted

技术标签:

【中文标题】IsNumeric 中的边缘案例 - 这是否想多了【英文标题】:Edge cases in IsNumeric- is this overthinking itIsNumeric 中的边缘案例 - 这是不是想多了 【发布时间】:2015-12-11 00:03:36 【问题描述】:

我的代码如下所示:

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

这是不是想多了? IsNumeric 是否有可能在这里返回 True 或 False 以外的值,或者这是一种不好的编程习惯?

【问题讨论】:

isnumeric 只会返回一个布尔值。 msdn.microsoft.com/en-us/library/6cd3f6w1(v=vs.90).aspx isnumeric 永远不会出错 @ThomasShera 使用 Resume Next 是不恰当的。看我的回答 @Nick.McDermaid 这当然是人为的,但这个例子的重点是至少有可能调用IsNumeric 可能会触发一个错误,所以至少可以想象这样一个call 可能需要嵌入到错误处理程序中。 是的,但是那里没有错误处理程序,只是一个错误混淆器:) 【参考方案1】:

不需要else,因为它会是真或假,但请注意Else应该是Case Else(尽管您将要删除它,但尚无定论)

基于此,虽然我不会只为 2 个选项使用案例:

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 逐行查看它实际上是如何处理错误的。

【讨论】:

所以我们在我们开始的地方结束***.com/questions/34211344/vba-iif-syntax-error 大声笑,我在这两个问题上,甚至没有意识到这是同一个人。 @DanDonoghue 非常感谢,我单步执行了代码,我不知道关于重命名工作表与另一张工作表同名的花絮。【参考方案2】:

来自 OP 的评论 我没有使用我的错误处理程序。我想用希望的数字输出做一些事情

Sub demo()
    Dim inputs As Variant

    inputs = InputBox("Prompt", "Title", "Default")

    If Not IsNumeric(inputs) Then
        notnum
    Else
        ' Do what you want with numeric input inside the Else

    End If

    ' Maybe do more stuff irrespective of input

End Sub

Sub notnum()
    ' do not numeric stuff here
End Sub

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

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

【讨论】:

【参考方案3】:

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

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 中的边缘案例 - 这是否想多了的主要内容,如果未能解决你的问题,请参考以下文章

Linq 中的 IsNumeric 等效项

程序员饭碗的只有应届生?你想多了,还有这一批......

本田脱离中国市场?想多了,没有中国市场将失去三分之一的销量

国产手机硬杠苹果?想多了,消费者等着抢购iPhone14

中国移动的固网宽带免费?想多了,收费快接近中国电信了,它已从中获取近千亿收入...

UICollectionView BatchUpdate 边缘案例失败