如何获取数组值的错误编号
我简化了我的示例,使其保持简短,并将以下值放在范围A1到A4中。
A1 = 0
A2 = empty 'blank cell
A3 = match(0;0;0) 'to produce #N/A
A4 = 4,95
我想赶上在A3
触发的错误号码,已经存储在数组中,
我只想打印正值。
- test1 =>产生一个运行时错误13,即使我已经检查了
IsError
。 - test2 =>跳过错误是非常棘手的。
-
test3 =>在我看来,这是最好的解决scheme,但我不知道如何得到错误号码。
Sub test1() Dim i As Long Dim arr() As Variant arr = ActiveSheet.Range("A1:A4").Value For i = 1 To 4 If Not IsError(arr(i, 1)) And Not IsEmpty(arr(i, 1)) And arr(i, 1) <> "0" Then MsgBox arr(i, 1) End If Next i End Sub
Sub test2() Dim i As Long Dim arr() As Variant arr = ActiveSheet.Range("A1:A4").Value On Error Resume Next For i = 1 To 4 If Not IsEmpty(arr(i, 1)) And arr(i, 1) <> "0" Then MsgBox arr(i, 1) End If Next i End Sub
Sub test3() Dim i As Long Dim arr() As Variant arr = ActiveSheet.Range("A1:A4").Value For i = 1 To 4 If IsError(arr(i, 1)) = True Then MsgBox "error at position " & i ElseIf Not IsEmpty(arr(i, 1)) And arr(i, 1) <> "0" Then MsgBox arr(i, 1) End If Next i End Sub
sub test1
的问题在于VBA
试图在AND
评估所有条件AND
即使一个条件已经是FALSE
。 所以错误是从...arr(i, 1) <> "0"...
试图比较Error
和String
。
Sub test1() Dim i As Long Dim arr() As Variant arr = ActiveSheet.Range("A1:A4").Value For i = 1 To 4 If Not IsError(arr(i, 1)) Then If Not IsEmpty(arr(i, 1)) Then If arr(i, 1) <> "0" Then MsgBox arr(i, 1) End If End If End If Next i End Sub
应该运行没有运行时错误。
知道这一点,你可以这样做:
Sub test1() Dim i As Long Dim arr() As Variant arr = ActiveSheet.Range("A1:A4").Value For i = 1 To 4 If Not IsEmpty(arr(i, 1)) Then If IsError(arr(i, 1)) Then MsgBox CStr(arr(i, 1)) ElseIf arr(i, 1) <> "0" Then MsgBox arr(i, 1) End If End If Next i End Sub
使用CStr
显式转换是必要的,因为VBA
不会隐式转换Error
为String
而它隐式转换Double
String
像0
– > "0"
和4.95
– > "4.95"
如果只需要错误号,那么使用CLng
显式转换也是可能的。
If IsError(arr(i, 1)) Then ... ...CLng(arr(i, 1)) ... End If