【问题标题】:Capturing connection errors捕获连接错误
【发布时间】:2015-12-02 21:54:36
【问题描述】:

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

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

【问题讨论】:

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

标签: excel vba error-handling


【解决方案1】:

是的,该示例将捕获连接错误。将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 的错误处理程序时运行它,则会导致错误... 是的。丑。

【讨论】:

  • 与 'line' 或 '-1' 相比,'0' 有什么作用?
  • @sean 已编辑 - 查看修订版
  • 感谢您的参考。
猜你喜欢
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 2016-01-06
  • 2016-01-29
  • 1970-01-01
  • 1970-01-01
  • 2015-12-05
  • 1970-01-01
相关资源
最近更新 更多