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?
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
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被添加到字符串中,函数结束.
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并且不再通过循环代码.
由此可以解释,在一个For或While循环的情况下,循环将以类似的方式操作,采用文字的下一行并且当击中循环的底部时返回.