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
循环的情况下,循环将以类似的方式操作,采用文字的下一行并且当击中循环的底部时返回.