发现在循环中,ON ERROR语句只能一次有效,循环到第二次就报错了。做个实验,下面这些代码,事实上TPM文件夹并不存在,正常运行会报错,但用ON ERROR控制让循环继续,但发现第二次循环,即i=2时,on error语句就报错了。可有解决方法?
Sub test()
Do While i <> 4
For i = 1 To 3
On Error GoTo Line:
ChDir "D:\TMP"
Line:
Next i
On Error GoTo Line:
Loop
End Sub
VBA循环中如何能使ON ERROR语句多次有效
答案:1 悬赏:50 手机版
解决时间 2021-02-18 20:17
- 提问者网友:不要迷恋哥
- 2021-02-18 12:44
最佳答案
- 五星知识达人网友:长青诗
- 2021-02-18 14:06
问题是,你的Line后面根本没有处理错误。
帮助文档里是这样解释的:
“一个“允许的”错误处理程序是由 On Error 语句打开的一个处理程序;一个“活动的”错误处理程序是处理错误的过程中允许的错误处理程序。如果在错误处理程序处于活动状态时(在发生错误和执行 Resume、Exit Sub、Exit Function 或 Exit Property 语句之间这段时间)又发生错误,则当前过程的错误处理程序将无法处理这个错误。”
加一句:Resume Next
Sub test1()
Dim i
Do While i <> 4
For i = 1 To 3
On Error GoTo Line
ChDir "D:\TMP"
Line:
Resume Next
Next i
On Error GoTo Line:
Loop
End Sub
或者,干脆用On Error Resume Next 吧
Sub test2()
Dim i
On Error Resume Next
Do While i <> 4
For i = 1 To 3
ChDir "D:\TMP"
Next i
Loop
End Sub
你也可以仔细研究一下帮助文档里的例子
On Error 语句示例
本示例先使用 On Error GoTo 语句在一个过程中指定错误处理的代码所在。本示例中,试图删除一已经打开的文件从而生成的错误码为 55。这个错误将由示例中的错误处理程序码来处理,处理完后,控制会回到发生错误的语句处。On Error GoTo 0 语句关闭错误陷阱。然后 On Error Resume Next 语句用来改变错误陷阱,以便发觉下一个语句产生的错误的范围。请注意示例中使用 Err.Clear 在错误处理完后,清除 Err 对象的属性。
Sub OnErrorStatementDemo()
On Error GoTo ErrorHandler ' 打开错误处理程序。
Open "TESTFILE" For Output As #1 ' 打开输出文件。
Kill "TESTFILE" ' 试图删除已打开的文件。
On Error Goto 0 ' 关闭错误陷阱。
On Error Resume Next ' 改变错误陷阱。
ObjectRef = GetObject("MyWord.Basic") ' 试图启动不存在
' 的对象
'检查可能发生的 Automation 错误。
If Err.Number = 440 Or Err.Number = 432 Then
' 告诉用户出了什么事。然后清除 Err 对象。
Msg = "There was an error attempting to open the Automation object!"
MsgBox Msg, , "Deferred Error Test"
Err.Clear ' 清除 Err 对象字段。
End If
Exit Sub ' 退出程序,以避免进入错误处理程序。
ErrorHandler: ' 错误处理程序。
Select Case Err.Number ' 检查错误代号。
Case 55 ' 发生“文件已打开”的错误。
Close #1 ' 关闭已打开的文件。
Case Else
' 处理其他错误状态 . . .
End Select
Resume ' 将控制返回到产生错误的语句。
End Sub
帮助文档里是这样解释的:
“一个“允许的”错误处理程序是由 On Error 语句打开的一个处理程序;一个“活动的”错误处理程序是处理错误的过程中允许的错误处理程序。如果在错误处理程序处于活动状态时(在发生错误和执行 Resume、Exit Sub、Exit Function 或 Exit Property 语句之间这段时间)又发生错误,则当前过程的错误处理程序将无法处理这个错误。”
加一句:Resume Next
Sub test1()
Dim i
Do While i <> 4
For i = 1 To 3
On Error GoTo Line
ChDir "D:\TMP"
Line:
Resume Next
Next i
On Error GoTo Line:
Loop
End Sub
或者,干脆用On Error Resume Next 吧
Sub test2()
Dim i
On Error Resume Next
Do While i <> 4
For i = 1 To 3
ChDir "D:\TMP"
Next i
Loop
End Sub
你也可以仔细研究一下帮助文档里的例子
On Error 语句示例
本示例先使用 On Error GoTo 语句在一个过程中指定错误处理的代码所在。本示例中,试图删除一已经打开的文件从而生成的错误码为 55。这个错误将由示例中的错误处理程序码来处理,处理完后,控制会回到发生错误的语句处。On Error GoTo 0 语句关闭错误陷阱。然后 On Error Resume Next 语句用来改变错误陷阱,以便发觉下一个语句产生的错误的范围。请注意示例中使用 Err.Clear 在错误处理完后,清除 Err 对象的属性。
Sub OnErrorStatementDemo()
On Error GoTo ErrorHandler ' 打开错误处理程序。
Open "TESTFILE" For Output As #1 ' 打开输出文件。
Kill "TESTFILE" ' 试图删除已打开的文件。
On Error Goto 0 ' 关闭错误陷阱。
On Error Resume Next ' 改变错误陷阱。
ObjectRef = GetObject("MyWord.Basic") ' 试图启动不存在
' 的对象
'检查可能发生的 Automation 错误。
If Err.Number = 440 Or Err.Number = 432 Then
' 告诉用户出了什么事。然后清除 Err 对象。
Msg = "There was an error attempting to open the Automation object!"
MsgBox Msg, , "Deferred Error Test"
Err.Clear ' 清除 Err 对象字段。
End If
Exit Sub ' 退出程序,以避免进入错误处理程序。
ErrorHandler: ' 错误处理程序。
Select Case Err.Number ' 检查错误代号。
Case 55 ' 发生“文件已打开”的错误。
Close #1 ' 关闭已打开的文件。
Case Else
' 处理其他错误状态 . . .
End Select
Resume ' 将控制返回到产生错误的语句。
End Sub
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯