我似乎遇到了一个我之前没有过的独特问题,无法通过谷歌找到答案。
我写了一个小子程序来简单地打开一个包含单词" Control"在里面。
问题:尽管有一个错误处理程序可以运行,我从excel获得一个弹出框,说它无法打开工作簿。
以下是代码:
Sub OpenControlSheet(index As Integer)
Dim strFilePath As String
Dim strFileName As String
On Error GoTo ErrorHandler
strPlan = arrPlanPeriods(index)
ResumePoint:
strFilePath = "S:\Misc. Budget\" & strPlan & "\" & "*Control*"
strFileName = Dir(strFilePath)
ResumePoint2:
Set wb = Workbooks.Open("S:\Misc. Budget\" & strPlan & "\" & strFileName)
ErrorHandler:
If Err.Number <> 0 Then
'Do stuff
End if
End sub
基本上,错误处理程序执行的操作是操作文件路径,直到找到正确的名称。例如,如果&#34; 92 Pol&#34;没有用,然后尝试&#34; 92民意调查。&#34;但在尝试新路径之前,我总是得到以下错误对话:
&#34;无法打开&#39; S:\ Misc。预算\ 92 Pol&#39;&#34;
然后它会通过错误处理程序并打开正确的工作簿。
我认为如果它通过错误处理程序然后我不应该弹出任何错误对话框。知道为什么会这样吗?
答案 0 :(得分:2)
如果错误处理部分内部出现错误,则不会被任何错误处理代码捕获,并产生标准的VBA错误消息。
Sub errors()
On Error GoTo ErrorHandler
x = 1 / 0
ErrorHandler:
x = 1 / 0 ' Error message will pop up here
End Sub
现在,使用goto语句(我只是假设你做了类似的事情,因为你没有显示代码的一部分)不让你 - 逻辑上 - 从错误处理程序举个例子:
Sub errors()
start:
On Error GoTo ErrorHandler
x = 1 / 0 ' Error will pop up here ON THE SECOND GO
ErrorHandler:
GoTo start
End Sub
即使您再次看到On Error GoTo ErrorHandler
,也会弹出错误消息。 不,它不会是一个无限循环!
另一方面,使用Resume关键字会使逻辑脱离错误处理部分:
Sub errors()
On Error GoTo ErrorHandler
x = 1 / 0
TryAgain:
On Error GoTo TotalFailure
x = 1 / 0
ErrorHandler:
Resume TryAgain
TotalFailure:
MsgBox "Nyekk."
End Sub
因此,请确保错误处理代码部分中不会发生错误。 VBA在处理错误方面非常蹩脚。
尝试使用F8单步执行我的示例。
此外,此设置可能会导致一些奇怪的行为:
答案 1 :(得分:1)
有两种方法可以解决您的问题 第一个是使用
On Error Resume Next
On Error Resume Next将执行下一行代码,即使发生错误,然后您可以使用
检查错误If Err.Number <> 0 Then
示例代码如下:
Sub OpenControlSheet(index)
Dim strFilePath As String
Dim strFileName As String
' Add this line above the code
On Error Resume Next
strPlan = arrPlanPeriods(index)
strFilePath = "S:\Misc. Budget\" & strPlan & "\" & "*Control*"
strFileName = Dir(strFilePath)
' You will go through Workbooks.Open() even if error is occured
Set wb = Workbooks.Open("S:\Misc. Budget\" & strPlan & "\" & strFileName)
If Err.Number <> 0 Then
'Do stuff
End If
End Sub
第二种方法是在打开文件之前检查文件是否存在 当你使用
strFileName = Dir(strFilePath)
如果文件名存在,则返回文件名,如果文件或路径不存在,则返回空字符串。
示例代码:
Sub OpenControlSheet(index)
Dim strFilePath As String
Dim strFileName As String
strPlan = arrPlanPeriods(index)
strFilePath = "S:\Misc. Budget\" & strPlan & "\" & "*Control*"
strFileName = Dir(strFilePath)
If strFileName <> "" Then
' Path/File exists
Set wb = Workbooks.Open("S:\Misc. Budget\" & strPlan & "\" & strFileName)
Else
' Path/File not exists
' Do stuff
End If
End Sub
希望这会让你开心。