vba - 如何获取数组值的错误号

标签 vba excel error-handling excel-2010

为了简化起见,我简化了示例,并将以下值放在A1至A4范围内。
A1 = 0A2 = empty 'blank cellA3 = match(0;0;0) 'to produce #N/AA4 = 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
    
  • 最佳答案

    sub test1的问题在于,即使一个条件已经是VBAAND也会尝试评估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不会像将Error-> StringDouble-> 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/

    相关文章:

    php - 禁用 laravel 的内置错误屏幕

    error-handling - Ansible区 block : Re-raising errors in `rescue` block

    vba - 相等时的字符串和数值返回真

    Excel 中的 VBA 公共(public)用户定义函数

    vba - 删除 Excel 行而不取消隐藏另一行,VBA

    vba - 在vba excel中执行参数化插入查询

    excel - VBA在Excel中为Word文档执行宏

    excel - 使用 OleDbConnection::GetOleDbSchemaTable() 列出 excel 表

    json - 打开网页,全选,复制到工作表

    sql - Teradata:如何在存储过程中引发错误