为什么这不能抑制错误?
For i = 1 To Last_row
On Error GoTo errorhandler1
Set wkb = Workbooks.Open(Filename:=l)
'' my code
errorhandler1:
next I
这就是我得到的:
答案 0 :(得分:3)
在开始之前,您的代码未正确设置以进行错误处理。
我发现,一旦GoTo errohandler1
在第一个实例中被执行,未来的调用将被忽略,以便在抛出错误时进行。
您当前的代码设置为在打开工作簿时忽略错误,您可以使用Resume Next
,然后GoTo 0
来重置错误处理方法。
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
答案 1 :(得分:2)
On Error GoTo
不仅仅是某种条件GoTo
跳跃。
当运行时遇到错误,处于错误状态时,您需要清除。
错误处理子程序不仅仅是标签代码在发生错误时跳转到的地方 - 它处理运行时错误。
跳转到Next
语句,表明下一次迭代发生在运行时错误状态,因为你没有Clear
错误状态...所以执行恢复并且一直在执行,就VBA运行时而言,循环体本身就成了错误处理子例程:VBA正在等待Err.Clear
,或Resume Next
,或任何其他告诉它的语句"所有好的,错误处理,移动,没有什么可看到这里"。
errorhandler1:
Err.Clear
On Error GoTo 0
next i
这可以解决眼前的问题,但仍然会给你一个非常复杂的代码。最好从错误的路径中提取错误处理清除"。
答案 2 :(得分:1)
不确定为什么你不能绕过找不到错误的文件......
尝试使用子函数来返回打开的文件(如果找到)?
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