如何获取数组值的错误编号

我简化了我的示例,使其保持简短,并将以下值放在范围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"...试图比较ErrorString

 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不会隐式转换ErrorString而它隐式转换Double String0 – > "0"4.95 – > "4.95"

如果只需要错误号,那么使用CLng显式转换也是可能的。

 If IsError(arr(i, 1)) Then ... ...CLng(arr(i, 1)) ... End If