VBA 出错 GoTo 突然停止工作

问题描述 投票:0回答:2

我对 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
,它同时停止工作。 如前所述,代码之前已经运行过,所以我不知道可能出了什么问题。

有人有类似问题的经验以及任何可能的解决方案吗?

excel vba error-handling runtime-error
2个回答
2
投票

错误处理

  • 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

1
投票

虽然

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
© www.soinside.com 2019 - 2024. All rights reserved.