即使出现错误处理,Excel错误对话框仍会弹出

时间:2016-05-12 21:41:12

标签: excel vba error-handling

我似乎遇到了一个我之前没有过的独特问题,无法通过谷歌找到答案。

我写了一个小子程序来简单地打开一个包含单词" 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;

然后它会通过错误处理程序并打开正确的工作簿。

我认为如果它通过错误处理程序然后我不应该弹出任何错误对话框。知道为什么会这样吗?

2 个答案:

答案 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单步执行我的示例。

此外,此设置可能会导致一些奇怪的行为:

Break on all errors

答案 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

希望这会让你开心。