在放置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.Clear
或Resume 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