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

时间:2016-11-11 16:30:36

标签: vba error-handling

在VBA代码中处理错误时there are a few methods commonly utilized。其中一种方法是使用On Error Resume Next进行内联错误处理。但是,如果程序在下一行继续执行或者程序将在下一个逻辑点继续执行,我在阅读现有问题“VBA: How long does On Error Resume Next work?”后发现不清楚。

MSDN has the following description了解On Error Resume Next的功能:

  

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

此外,Resume关键字上有(现已停用)StackOverflow文档,其中列出了与On Error Resume Next类似的内容:

  

Resume Next在紧随其后的声明中继续执行   导致错误的声明。如果错误实际上不是   在执行此操作之前处理,然后允许执行继续   可能无效的数据,可能导致逻辑错误和   出乎意料的行为。

这并未明确说明错误处理行如何处理控制流语句的初始行中的错误。具体来说,如果错误发生在If .. Then .. Else .. End If语句的第一行,程序是否会从If语句中的第一行开始运行,或者程序将在{{{}后的第一行开始运行1}}陈述?

1 个答案:

答案 0 :(得分:5)

当合格声明导致错误时,

On Error Resume Next会导致程序进入If .. Then语句或[While/Do/For/For Each]循环。

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

Test1 - 如果声明

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

当输入的数字为If 1 / intN > 0 Then时,此函数会在0行引发错误,并会评估其他数字,例如1-1

<强>结果:

Test1(-1) -> BC
Test1(0)  -> AC
Test1(1)  -> AC

如结果所示,Test1(0)中的错误导致程序跳过行If 1 / intN > 0 ThenA已添加到字符串中,然后该程序已从 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

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

<强>结果:

Test1(-1) -> C
Test1(0)  -> AC
Test1(1)  -> AAC

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

每当intN = 0时,程序都会遍历循环中包含的代码并点击intN = intN - 1,导致intN = -1,而不会再次查看循环代码。

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