如果您期望数组的指定位置上的数字值不需要构建庞大的错误处理程序或使用GoTo,则可以检查变量的Type
! 因此,例如:
For i = 1 To r
If IsNumeric(dataArray(i,1)) And Not IsString(dataArray(i,1)) Then
If dataArray(i,1) <10 Then
intA = intA + 1
End If
If dataArray(i,2) <10 Then intB = intB + 1
If dataArray(i,2) <10 Then _
intC = intC + 1: intD = intD + 1
End If
Next i
Public Function IsString(ByRef var as Variant) as Boolean
IsString = (TypeName(var) = "String")
End Function
正如你看到的,你可以检查IsNumeric
和,因为字符串可以是数字,则显式检查Not IsString
。
由于不仅字符串可以从IsNumeric
函数返回True(例如字符),还可以修改示例并增加自己的函数!
链接: TypeName, IsNumeric
另一实例(仅与一个小数点,并允许琴弦号码)。 因此,如果输入的外观是这样的:
例子:
Sub AcceptOnlyNumbers()
'pass only strings that can be threaten as doubles
Dim rng As Range
Dim cl As Range
Set rng = Sheets(1).[A1:A8]
For Each cl In rng
With cl
If Not (IsNumeric(.Value2) Or (IsNumeric(Val(.Value2)) And _
Len(.Value2) = Len(CStr(Val(.Value2))))) And .Value2 <> vbNullString Then
Debug.Print .Value2, "is filtered"
Else
Debug.Print .Value2, "is passed"
End If
End With
Next
End Sub
输出:
而在这之后,如果小数点是逗号,我们可以将字符串CDbl
如果使用小数点,则使用Val
。随意玩吧!例如,如果你不需要小数,你可以在此之后添加其他检查(或者,再次,构建自己 - 这一切只是例子,你可以检查在启动整数):
Public Function IsWholeNumber(ByVal expDbl As Double) as Boolean
IsWholeNumber = (Int(expDbl) = expDbl)
'or more bulky but ok too: IsWholeNumber = InStr(Str(expDbl), ".") = 0
End Function
请注意,在小数点后的国家CDbl
适用于dot,我的示例工作方式不同(逗号值也被过滤)。
Val
,Str
将始终使用美国设置(如点十进制)。
CDbl
,CStr
将考虑区域设置。
链接: Val, Writing International Code
可以更好地解释什么是你想达到什么目的?以及你在哪里得到你的错误(不使用'On Error Resume Next')。有时候最好是陷阱并处理你的错误) –
你总是可以添加一个额外的测试'如果Err.Number = 0',你也可以在适当的地方使用像'Err.Clear'这样的语句。但是,您不应该大量使用'On Error Resume Next'机制,它只是一个非常方便的“诀窍”,但如果您确实想在您的代码中指望它,那么您应该重新考虑这一决定。 –
例如,在上面的代码中,如果变量不能保证是一个数字,一个*好的*代码首先应该用'IsNumeric'来测试它,而不是依靠错误处理来计算,因为后者不是一个“流量控制”指示。 –