我编写了一个excel VBA脚本,该脚本引用了另一个打开的excel文档来获取其中的一些数据。最近我注意到,如果用户意外关闭了这个辅助文档,则主脚本将停止工作。显然,在搜索之前我需要检查以确保它是打开的。
下面是我提出的用于验证工作簿是否已打开的代码。如果是,我格式化。如果不是,我打开它(触发它自己的格式)。问题出现了,因为我的错误处理程序捕获了"所需的对象"错误号码424.我试着通过指示它在发生这种情况时立即恢复来解决这个问题。不幸的是,似乎想要选择案例而不是案例424并停止剧本。
On Error GoTo searchGridsError
GridName = Workbooks(SALTname).Sheets(2).Range("B3").value
If Verify.FirstOption.value = True Then
Set Verify.groupGrid = Workbooks(GridName)
If Verify.groupGrid Is Nothing Then
Verify.checkForGrids
Else
formatWorkbook
End If
End If
下面是我的错误处理程序:
searchGridsError:
Select Case Err
Case 18
Verify.clearData
Exit Function
Case 424
Resume Next
Case Else
MsgBox "An error has occurred while searching the customer number grid. Please try again or search manually."
Module1.ReportError Err.Number, Erl, Err.Description, "searchGrids", Verify.Address1Box & "," & Verify.Address2Box & "," & Verify.CityBox & "," & Verify.StateBox & "," & Verify.ZipBox & "," & Verify.ContractBox & "," & Verify.PBPBox & "," & Verify.CountyBox
Verify.clearData
Exit Function
End Select
End Function
有没有人对为什么会这样做有任何想法?它必须在错误处理程序中,但我已经看到许多看起来像我的例子。
答案 0 :(得分:2)
正如guitarthrower在评论中所述,只需将Resume Next
放入错误处理中,就不会将宏恢复到错误发生的位置。要做到这一点,您需要在On Error GoTo searchGridsError
行之后添加另一个占位符,例如RestartHere:
,以便跳转到Resume Next
,然后将其替换为On Error Resume Next
GoTo RestartHere
:
On Error Resume Next
但是,一旦遇到错误424,这将绕过您的错误处理,因此您应该警惕它的使用方式。
可能更好的解决方案是将错误处理放在您希望错误发生的代码中。您可以将代码保留原样。但是,在抛出错误424的行之前,添加If Err.Number = 424 Then
Err.Clear
End If
On Error GoTo searchGridsError
。然后在相关行之后添加以下内容:
{{1}}