继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 :(得分: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
的错误处理程序...是的。难看。