VBA错误处理程序未在错误处理程序中检测到错误

时间:2019-02-26 09:27:55

标签: excel vba error-handling

我使用这个超级有用的论坛已有一段时间了,总是能找到我问题的答案。你是最棒的!

但是这一次我似乎找不到解决简单情况的解决方案。尝试了一些建议,但似乎不起作用...

因此,我想使用GUI从另一个软件下载两个报告。但有时,Report1或/和Report2不存在。

Sub Report_download()
    On Error Goto RP1_err
        'GUI codes to download Report(1)

    On Error Goto RP2_err
        'GUI codes to download Report(2)

    MsgBox "Both Reports downloaded."

    Exit Sub

RP1_err:
        If MsgBox("Report(1) not found. Proceed to Report(2) download?", 
vbYesNo) = vbNo Then Exit Sub
        On Error Resume Next
            'GUI codes to download Report(2)
        If Err.Number > 0 Then
        MsgBox "Neither Report(1) nor Report(2) Found"
        End If
    Exit Sub


RP2_err:
    MsgBox "Report(1) downloaded, Report(2) not found. Review manually."

    Exit Sub

End Sub

当我针对既不存在Report(1)也不存在Report(2)的情况运行此程序时,我执行RP1_err错误处理程序后,“如果要下载Report(2)的GUI代码”错误就会发生,按“是”。但是,下面是,而不是显示消息“找不到Report(1)或Report(2)”,而是出现了一个调试对话框。我在做什么错了?

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

感谢您的所有评论!根据您的建议,我使用

提出了快速解决方案
makeaclitem

在我的情况下效果很好。然后,我研究了布尔函数的工作原理并提出了解决方案。 (尽管,我相信我的代码相当令人恶心...)

快速修复:

on Error goto -1

布尔值

Sub Report_download()
    On Error Goto RP1_err
        'GUI codes to download Report(1)

    On Error Goto RP2_err
        'GUI codes to download Report(2)

        MsgBox "FVD reports downloaded."

        Exit Sub

RP1_err:
    AppActivate Application.Caption
    DoEvents
    If MsgBox("RP1 not found. Proceed to RP2?", vbYesNo) = vbNo Then Exit Sub
        On Error GoTo -1
        On Error GoTo VDC_err
        'GUI codes to download Report(2)

    Exit Sub

Both_err:
    AppActivate Application.Caption
    DoEvents
    MsgBox "No VDC report saved."

    Exit Sub

RP2_err:
    AppActivate Application.Caption
    DoEvents
    MsgBox "RP1 saved. RP2 not saved."

    Exit Sub

End Sub

不确定这是否是“使用布尔值”的意思,无论这是一次学习经历。谢谢!

此外,由于它们很长且包含一些敏感数据,因此我无法共享GUI的确切代码,因此我需要逐行检查它们。抱歉!

答案 1 :(得分:0)

我会像这样重构您的代码:

Option Explicit

Sub Report_download()
    Dim blnSuccess1 As Boolean: blnSuccess1 = DownloadReport1
    Dim blnSuccess2 As Boolean: blnSuccess2 = DownloadReport2

    If blnSuccess1 = False And blnSuccess2 = False Then
        Debug.Print "Both reports failed to download"
    ElseIf blnSuccess1 = False And blnSuccess2 = True Then
        Debug.Print "Report 1 failed to download"
    ElseIf blnSuccess1 = True And blnSuccess2 = False Then
        Debug.Print "Report 2 failed to download"
    Else
        Debug.Print "Both reports successfully downloaded"
        ' Process the results
    End If
End Sub

Function DownloadReport1() As Boolean
    On Error GoTo ErrorHandler
    ' Your code to do the actual download 1, which may cause error
    On Error GoTo 0
    DownloadReport1 = True
    Exit Function
ErrorHandler:
    DownloadReport1 = False
End Function

Function DownloadReport2() As Boolean
    On Error GoTo ErrorHandler
    ' Your code to do the actual download 2, which may cause error
    On Error GoTo 0
    DownloadReport2 = True
    Exit Function
ErrorHandler:
    DownloadReport2 = False
End Function

这样,由于您只需要关注每个函数中的一个问题,就更容易理解错误处理。

此外,调试更容易,因为您可以跳过DownloadReport1或DownloadReport2。

此外,它更加灵活:您可以删除报告1和2,也可以轻松添加报告3。

随后,您可能具有用于报告1、2和3的功能,以及用于下载报告1和2的子菜单,以及用于下载1和3的子菜单。在这种情况下,您可以避免冗余(两次编码以下载报告1)