VBA的3种错误处理方式 on error goto 0 /-1 , on error resume next , on error goto index,是抛出异常,还是忽略报错,还是进行错误捕捉?

本文详细介绍了VBA中的错误处理语句,包括onerrorgoto0、onerrorgoto-1和onerrorresumenext的用法。通过实例展示了如何利用这些语句进行异常捕获和处理,以及如何在代码中实现错误的分段管理和自定义错误处理。同时,还探讨了onerrorgoto与特定行号结合使用的方法,以及如何在多错误场景下进行有效控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

总结

  • on error goto 0 /-1        '直接抛出异常
  • on error resume next    '忽略,但是可以配合 if 等来处理
  • on error goto  index       '处理异常

1 基本错误捕捉语句 (自动抛出异常)

  • on error goto 0     约等于   缺省默认,什么也不写
  • on error goto 0     停止执行!并且直接抛出对应错误。
  • on error goto -1  处理掉前面的出错进程,又开启一个新的,也会报错
  • 两者详细差别,stack overflow上有

excel - Difference between 'on error goto 0' and 'on error goto -1' -- VBA - Stack Overflow

 

2 其他错误处理语句 (不抛出异常 / 不管异常 / 或 同时自己处理异常)

  • on error resume next
  • on error resume next  配合 if 一样可以部分实现 类 on error goto 0 效果,但一般来说肯定没有on error goto 0 全!

 一个例子

Sub t5()

On Error Resume Next
a = 1 / 0
Debug.Print "a=" & a

On Error GoTo 0
b = 1 / 0
Debug.Print "b=" & b

End Sub

3 错误处理其他方法

  • on error goto  index
  • 配合 index 使用
  • 注意  block 是顺序执行,on error goto  index 只影响它后面的语句

  • 纯文本提示也可以
  • on error goto  Err_Handle
  • 配合Error_Handle:使用

Error_Handle:
    errNum = ErrorsHandle
    If errNum = 0 Then
        Resume
    ElseIf errNum = 1 Then
        Resume Next
    Else
        Exit Sub
    End If

举例说明,如果要多次处理不同的错误,或者分段处理报错

  • on error goto XX  单独使用一般只能处理一次报错,写多个也没用
  • on error goto XX  配合 on error goto -1 可以处理这种情况
  • on error resume next 屏蔽报错,然后用if 处理也可以(但是要有if 确实遍历了所有出错的可能性)

例子1 

Sub t2()

    On Error GoTo line1
    a = 1 / 0
    Debug.Print "11"
line1:
    Debug.Print "12"
    
    On Error GoTo line2
    b = 1 / 0
    Debug.Print "21"
line2:
    Debug.Print "22"
        
    On Error GoTo line3
    c = 1 / 0
    Debug.Print "31"
line3:
    Debug.Print "32"

End Sub

例子2

Sub t4()

    On Error GoTo line1
    a = 1 / 0
    Debug.Print "11"
line1:
    On Error GoTo -1
    Debug.Print "12"
    
    On Error GoTo line2
    b = 1 / 0
    Debug.Print "21"
line2:
    On Error GoTo -1
    Debug.Print "22"
        
    On Error GoTo line3
    c = 1 / 0
    Debug.Print "31"
line3:
    On Error GoTo -1
    Debug.Print "32"

End Sub

例子3 

Sub t3()

On Error Resume Next
    a = 1 / 0
    Debug.Print "11"
line1:
    Debug.Print "12"
    
    b = 1 / 0
    Debug.Print "21"
line2:
    Debug.Print "22"
        
    c = 1 / 0
    Debug.Print "31"
line3:
    Debug.Print "32"

End Sub

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值