在放置error handling程序后出现运行时错误1004?

为什么这不能抑制错误?

For i = 1 To Last_row On Error GoTo errorhandler1 Set wkb = Workbooks.Open(Filename:=l) '' my code errorhandler1: next I 

这是我得到的:

这个错误

在开始之前,您的代码没有正确设置用于error handling。

我发现一旦GoTo errohandler1在第一次被执行,将来的调用被忽略,所以这是错误被抛出的时候。

当前代码设置为在打开工作簿时忽略错误,可以使用Resume Next实现此操作,然后GoTo 0重置error handling方法。

  For i = 1 To Last_row On Error Resume Next Set wkb = Workbooks.Open(Filename:=l) On Error GoTo 0 If Not wkb Is Nothing Then '' my code End If next I 

如果你想真正处理错误 – 而不是忽略它们,你应该在循环之外这样做(强烈鼓励!)

  For i = 1 To Last_row On Error GoTo CleanFail Set wkb = Workbooks.Open(Filename:=l) '' my code next I Exit Sub CleanFail: 'deal with error 

On Error GoTo不仅仅是一些有条件的GoTo跳转。

当运行时遇到错误时, 它处于错误状态 ,您需要清除。

一个error handling子程序不仅仅是一个标签代码跳转到错误的情况下 – 这是你处理运行时错误的地方。

通过跳转到Next语句,可以使下一次迭代在运行时错误状态中发生,因为您没有Clear错误状态…所以执行恢复,并且一直就VBA运行时而言,循环体本身成为error handling子程序:VBA正在等待Err.ClearResume Next ,或者任何其他声明告诉它“一切正常,error handling,移动,没有在这里看到”。

 errorhandler1: Err.Clear On Error GoTo 0 next i 

这将解决眼前的问题,但仍然给你一个相当复杂的spaghettish的一段代码。 最好从“快乐的path”中提取error handling。

不知道为什么你不能绕过一个文件找不到错误…

尝试使用子函数返回打开的文件(如果find),而不是?

 Function GetWorkBook(ByVal sFullName As String, Optional ReadOnly As Boolean) As Workbook Dim sFile As String: sFile = Dir(sFullName) On Error Resume Next Set GetWorkBook = Workbooks(sFile) If GetWorkBook Is Nothing Then Set GetWorkBook = Workbooks.Open(sFullName, ReadOnly:=ReadOnly) End Function