2015-09-07 74 views
1

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 

可能有人请帮助我,或让我知道,如果这个代码将工作?

+0

至于ErrorHandler,我应该显示err.Description还是上面的代码会显示连接名称和描述? – Sean

回答

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,因此没有问题。

警告:永远不会永远不会忘记之前ErrorHandler。我做了一次,陷入了一个无限的错误循环中,我只能通过杀死Excel来逃脱。 Resume如果在实际没有处理错误时运行它,并且该错误投掷到具有Resume ......错误的错误处理程序,则会导致错误。丑陋。

+0

'0'与'line'或'-1'相对应做什么? – Sean

+0

@sean编辑 - 查看修订 – cxw

+0

感谢您的参考。 – Sean