捕获连接错误

时间:2015-09-07 10:59:36

标签: excel vba error-handling

my Connections query之后,我现在想捕获任何无法到达的连接并抛出错误消息,说明无法联系到相关连接。

这是我到目前为止的代码,但是,我不确定它是否捕获了任何错误:

Private Sub btnRefreshConns_Click()

    On Error GoTo ErrorHandler
    Dim cn As WorkbookConnection

    For Each cn In ActiveWorkbook.Connections
        cn.Refresh
    Next

    Exit Sub

ErrorHandler:
    MsgBox "A connection could not be reached" & cn.Name & ": " & cn.Description

End Sub

有人可以帮助我或让我知道这段代码是否有效?

1 个答案:

答案 0 :(得分:3)

是的,该示例将捕获连接错误。将MsgBox行更改为此以修复报告:

MsgBox "A connection could not be reached: " & Err.Number & ": " & Err.Description

Err包含有关最新错误的信息。

只有一个问题:所有错误都将被捕获,而不仅仅是连接错误。这就是为什么我建议你不要在你的错误处理程序中引用cn:如果发生无关的错误(例如,内存不足 - 可能发生这种情况,你不知道它将处于什么状态)。更好的方法是只包装感兴趣的代码。在你的For循环中:

    On Error GoTo ErrorHandler
    cn.Refresh
    On Error GoTo 0        ' Reset default error handling

修改On Error GoTo 0解除了您的ErrorHandler并返回默认的错误处理模式,即显示错误对话框。 0只是VBA编程为此目的识别的一个神奇数字。在Chip Pearson's page on the subject查看更多详细信息和说明,这是我个人的参考资料。

我从未使用过On Error GoTo -1,但是this answer表示我没有遗漏任何东西:)。它显然用于在ErrorHandler之后继续执行普通代码,但我总是使用Resume并且没有问题。

警告:永远不要忘记Exit Sub之前的ErrorHandler。我曾经做过一次并陷入无限错误循环中我只能通过杀死Excel来逃避。如果在实际处理错误时运行错误Resume会导致错误,并且该错误会发送给具有Resume的错误处理程序...是的。难看。