我对 VBA 中的错误处理有疑问。 该代码以前可以工作,但现在突然错误不再由
On Error GoTo
语句处理,而是代码崩溃并弹出错误消息,就好像 On Error GoTo 0
将处于活动状态一样。
以下是代码结构的示例:
On Error GoTo logError
For d = 0 To Doclist.Count -1
On Error GoTo DownloadFailed
session.findById("wnd[0]/tbar[1]/btn[30]").press
session.findById("wnd[1]/usr/sub:SAPLSPO4:0300/ctxtSVALD-VALUE[0,21]").Text = filepath
On Error GoTo logError
...
DownloadFailed:
Err.Clear
On Error GoTo logError
Next d
logError:
ws1.Cells(1, 7).Value = Err.Description
Workbooks("Main.xlsm").Save
在第一次迭代中,
On Error GoTo DownloadFailed
按预期工作,但此后代码崩溃了。
我收到的错误是运行时错误“619”。
我在一些类似的帖子上看到用 Err.Clear
清除错误,但这对我的代码没有任何作用。
在代码的另一部分中,我使用
On Error Resume Next
,它同时停止工作。
如前所述,代码之前已经运行过,所以我不知道可能出了什么问题。
有人有类似问题的经验以及任何可能的解决方案吗?
GoTo
关键字是为错误处理例程保留的,因此这个解决方案对此非常严格。GoTo
关键字跳过循环中的代码块是可以的,但我不认为它指的是使用 On Error
来执行此操作。Sub ErrorTest()
Dim LogErrorFound As Boolean
Dim ErrNum As Long
On Error GoTo LogError ' start error-handling routine
For d = 0 To Doclist.Count - 1
On Error Resume Next ' defer error trapping
session.findById("wnd[0]/tbar[1]/btn[30]").press
ErrNum = Err.Number
If ErrNum = 0 Then
session.findById("wnd[1]/usr/sub:SAPLSPO4:0300/ctxtSVALD-VALUE[0,21]").Text = filepath
ErrNum = Err.Number
End If
On Error GoTo LogError ' resume error-handling routine; clears error
If ErrNum = 0 Then
'...
'Else ' download failed i.e. 'ErrNum <> 0'; do nothing!?
End If
Next d
ProcExit:
If LogErrorFound Then
On Error Resume Next ' defer error trapping; avoid endless loop
ws1.Cells(1, 7).Value = Err.Description
Workbooks("Main.xlsm").Save
On Error GoTo 0 ' stop error trapping
MsgBox "A log error occurred.", vbCritical
Else
MsgBox "Finished successfully.", vbInformation
End If
Exit Sub
LogError: ' continuation of the error-handling routine
LogErrorFound = True
Resume ProcExit
End Sub
虽然
Err.Clear
确实清除了错误对象,但它不会像 Resume
或 On Error GoTo 0
那样重新启用错误处理。要手动执行此操作,请将 Err.Clear
替换为 On Error GoTo -1
,如下所示:
On Error GoTo logError
For d = 0 To Doclist.Count -1
On Error GoTo DownloadFailed
session.findById("wnd[0]/tbar[1]/btn[30]").press
session.findById("wnd[1]/usr/sub:SAPLSPO4:0300/ctxtSVALD-VALUE[0,21]").Text = filepath
On Error GoTo logError
...
DownloadFailed:
On Error GoTo -1
On Error GoTo logError
Next d
logError:
ws1.Cells(1, 7).Value = Err.Description
Workbooks("Main.xlsm").Save