在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}}陈述?
答案 0 :(得分:5)
On Error Resume Next
会导致程序进入If .. Then
语句或[While/Do/For/For Each]
循环。
为了解决这个问题,我在一个空的Excel(2007)工作簿中创建了一对测试函数。然后,我使用Excel的电子表格来评估已知错误案例和已知成功案例的函数。
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 Then
。 A
已添加到字符串中,然后该程序已从 Else
跳到 End If
。字符C
已添加到字符串中,函数已结束。
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
,而不会再次查看循环代码。
由此可以解释,在For
或While
循环的情况下,循环将以类似的方式运行,采用文字的下一行并在击中底部时返回一个循环。