为了简化起见,我简化了示例,并将以下值放在A1至A4范围内。A1 = 0
A2 = empty 'blank cell
A3 = match(0;0;0) 'to produce #N/A
A4 = 4,95
我想捕获A3
中触发的错误号,该错误号已经存储在数组中,并且我只想打印正值。
IsError
。 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
也会尝试评估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
关于vba - 如何获取数组值的错误号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40957341/