On Error Resume Next如何处理If语句和循环中的错误

Fri*_*itz 3 error-handling vba

在VBA代码中处理错误时,通常会使用一些方法.其中一种方法是使用in-line错误处理On Error Resume Next.但是,在读完现有问题" VBA:On Error Resume Next工作多长时间? "之后,如果程序继续在下一行执行或者程序将继续在下一个逻辑点执行,我发现它不清楚.

MSDN对以下功能的描述如下On Error Resume Next:

指定当发生运行时错误时,控制转到紧接执行继续执行错误的语句之后的语句.访问对象时,请使用此表单而不是On Error GoTo.

此外,Resume关键字上有(现已退役)StackOverflow文档,其中包含类似的内容On Error Resume Next:

Resume Next在导致错误的语句之后立即继续执行语句.如果在执行此操作之前未实际处理错误,则允许执行继续使用可能无效的数据,这可能导致逻辑错误和意外行为.

这并未明确说明错误处理行如何处理控制流语句的初始行中的错误.具体来说,如果错误发生在If .. Then .. Else .. End If语句的第一行,程序将在If语句内的第一行开始运行,还是程序在语句后的第一行开始运行End If

Fri*_*itz 5

On Error Resume Next当限定语句导致错误时,将导致程序进入If .. Then语句或[While/Do/For/For Each]循环.

为了解决这个问题,我在一个空的Excel(2007)工作簿中创建了一对测试函数.然后,我使用Excel的电子表格来评估已知错误案例和已知成功案例的函数.


测试1 - 如果声明

Public Function Test1(intN As Integer) As String
On Error Resume Next
    Test1 = ""
    If 1 / intN > 0 Then
        Test1 = Test1 + "A"
    Else
        Test1 = Test1 + "B"
    End If
    Test1 = Test1 + "C"
End Function
Run Code Online (Sandbox Code Playgroud)

If 1 / intN > 0 Then当输入数字为时,此函数将在行处抛出一个错误0,并将评估其他数字,如1-1.

结果:

Test1(-1) -> BC
Test1(0)  -> AC
Test1(1)  -> AC
Run Code Online (Sandbox Code Playgroud)

如结果所示,错误Test1(0)导致程序跳过该行If 1 / intN > 0 Then.A添加到字符串,然后把程序从跳过 Else End If.字符C被添加到字符串中,函数结束.


Test2 - [Do]循环

Public Function Test2(intN As Integer) As String
On Error Resume Next
    Test2 = ""
    Do While 1 / intN > 0
        Test2 = Test2 + "A"
        intN = intN - 1
    Loop
    Test2 = Test2 + "C"
End Function
Run Code Online (Sandbox Code Playgroud)

Do While 1 / intN > 0当输入数字为时,此函数将在行处抛出错误0,将返回AA..AC正整数的字符串,并返回C负整数.

结果:

Test1(-1) -> C
Test1(0)  -> AC
Test1(1)  -> AAC
Run Code Online (Sandbox Code Playgroud)

进入循环时,On Error Resume Next将导致程序Do While 1 / intN > 0直接跳转 到Test2 = Test2 + "A",无论它在哪个循环迭代.

无论何时intN = 0,程序都会遍历循环中包含的代码并点击intN = intN - 1,导致intN = -1并且不再通过循环代码.

由此可以解释,在一个ForWhile循环的情况下,循环将以类似的方式操作,采用文字的下一行并且当击中循环的底部时返回.