【问题标题】:VBA error handler: On Error Resume does not work in the handlerVBA 错误处理程序:On Error Resume 在处理程序中不起作用
【发布时间】:2019-02-07 15:19:00
【问题描述】:

在 Excel VBA 中,我打开一个 Word 应用程序和一个文档。 我想确保文档和 Word 在最后关闭,即使出现错误。

我用On Error GoTo ErrorHandler 创建了一个错误处理程序,它可以工作。但是当文档未打开时,objDoc.Close 失败(运行时错误 424),并且 Sub 在 objWord.Quit 之前中止,尽管我调用了 On Error Resume Next。

为什么On Error Resume Next 在那里不起作用?

(在 VBA 选项中,错误捕获设置为“Break on Unhandled Errors”。)

Sub test()
    On Error GoTo ErrorHandler
    ' Open doc in Word
    Set objWord = CreateObject("Word.Application")
    objWord.Visible = False
    Set objDoc = objWord.Documents.Open("not a valid doc.docx")

    ....

    ' Save and exit
    objDoc.Save
    objDoc.Close
    objWord.Quit
    Exit Sub

ErrorHandler:
    MsgBox "Error " & Err.Number & vbLf & Err.Description
    On Error Resume Next
    ' Exit
    objDoc.Close SaveChanges:=False
    objWord.Quit
    On Error GoTo 0
End Sub

【问题讨论】:

  • On Error 语句不应该在错误状态下执行...
  • 此类内容的常用模式是将Resume 转换为您进行清理的标签 - 例如' Save and exit 所在的位置。

标签: vba error-handling


【解决方案1】:

这就是我的做法,就像@Comintern 说的那样

Sub test()
    Dim objWord As Object
    Dim objDoc As Object

    On Error GoTo ErrorHandler
    ' Open doc in Word
    Set objWord = CreateObject("Word.Application")
    objWord.Visible = False
    Set objDoc = objWord.Documents.Open("not a valid doc.docx")




ErrExit:
    On Error Resume Next
    objDoc.Save
    objDoc.Close
    objWord.Quit
    Exit Sub

ErrorHandler:
    MsgBox "Error " & Err.Number & vbLf & Err.Description
    Resume ErrExit
End Sub

Resume 语句让您摆脱错误状态并允许您重置错误陷阱。

【讨论】:

  • 赞成;我只想补充一点,应该明确声明变量,objWord.Documents 的双点引用正在泄漏隐式集合对象,这意味着 OP 在其任务管理器中可能有一堆 WINWORD.EXE 幽灵进程(请参阅我的已删除答案)
猜你喜欢
  • 2018-05-15
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多