如果您期望數組的指定位置上的數字值不需要構建龐大的錯誤處理程序或使用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
另一實例(僅與一個小數點,並允許琴絃號碼)。 因此,如果輸入的外觀是這樣的:
![input](https://i.stack.imgur.com/ckv4K.png)
例子:
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
輸出:
![output](https://i.stack.imgur.com/YK65W.png)
而在這之後,如果小數點是逗號,我們可以將字符串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'來測試它,而不是依靠錯誤處理來計算,因爲後者不是一個「流量控制」指示。 –