【问题标题】:How to get error number of array value如何获取数组值的错误号
【发布时间】:2017-04-18 20:20:47
【问题描述】:

我已简化示例以使其简短,并将以下值放在 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 => 在我看来这是最好的解决方案,但我不知道如何获取错误号。

    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
    

【问题讨论】:

  • 错误号是什么意思?您的代码在位置 3 检测到错误。
  • 在本地窗口中我看到错误 2042 但我无法检查 if 语句。
  • 附注,If IsError(arr(i, 1)) = True,为什么是= True
  • 在文本 3 中,MsgBox CStr(arr(i, 1)) --> 错误 2042

标签: vba excel error-handling excel-2010


【解决方案1】:

sub test1 的问题在于,VBA 会尝试评估 AND 中的所有条件,即使其中一个条件已经是 FALSE。所以错误是从...arr(i, 1) &lt;&gt; "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 不会将Error 隐式转换为String,而它会像0 一样将Double 隐式转换为String-> "0"4.95 -> "4.95"

如果只需要错误号,也可以使用CLng 进行显式转换。

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

【讨论】:

  • 谢谢,我不熟悉CStr,我已经删除了=true IsError
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多