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