Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA错误处理程序:错误恢复在处理程序中不起作用_Vba_Error Handling - Fatal编程技术网

VBA错误处理程序:错误恢复在处理程序中不起作用

VBA错误处理程序:错误恢复在处理程序中不起作用,vba,error-handling,Vba,Error Handling,在ExcelVBA中,我打开了一个Word应用程序和其中的一个文档。 我想确保文档和Word在最后关闭,即使有错误 我创建了一个带有On error GoTo ErrorHandler的错误处理程序,可以正常工作。但是,当文档未打开时,objDoc.Close会失败运行时错误424,并且在objWord.Quit之前中止子对象,尽管我调用了error Resume Next 为什么错误恢复下一步不在那里工作 在VBA选项中,错误捕获设置为在未处理错误时中断 Sub test() On E

在ExcelVBA中,我打开了一个Word应用程序和其中的一个文档。 我想确保文档和Word在最后关闭,即使有错误

我创建了一个带有On error GoTo ErrorHandler的错误处理程序,可以正常工作。但是,当文档未打开时,objDoc.Close会失败运行时错误424,并且在objWord.Quit之前中止子对象,尽管我调用了error Resume Next

为什么错误恢复下一步不在那里工作

在VBA选项中,错误捕获设置为在未处理错误时中断

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

我会这样做,就像@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语句可以让您摆脱错误状态,并允许您重置错误陷阱。

下面是我的做法,就像@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语句使您脱离错误状态,并允许您重置错误陷阱。

On error语句不应在错误状态下执行……这类内容通常使用的模式是恢复到一个标签,在该标签上执行清理操作,如“Save and exit is.”请参阅-值得一读。On error语句不应该在错误状态下执行…像这样的东西通常使用的模式是恢复到进行清理的标签上,比如“保存并退出”的位置。请参见-值得一读。向上投票;我只想补充一点,变量应该显式声明,objWord.Documents的双点引用正在泄漏隐式集合对象,这意味着OP的任务管理器中可能有一堆WINWORD.EXE重影进程see my deleted answerupvote;我只想补充一点,变量应该显式声明,objWord.Documents的双点引用正在泄漏隐式集合对象,这意味着OP的任务管理器中可能有一堆WINWORD.EXE重影进程。请参阅我删除的答案