【问题标题】:Excel error dialogue still pops up even with error handling即使进行了错误处理,Excel 错误对话框仍然会弹出
【发布时间】:2016-05-12 21:41:12
【问题描述】:

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

我编写了一个小子程序来简单地打开一个包含“控制”一词的特定工作簿。

问题:尽管有一个可以工作的错误处理程序,但我从 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

基本上,错误处理程序所做的是操纵文件路径,直到找到正确的名称。例如,如果“92 Pol”不起作用,请尝试“92 Poll”。但在尝试新路径之前,我总是会收到以下错误对话框:

“无法打开 'S:\Misc. Budget\92 Pol'”

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

我认为如果它通过错误处理程序,那么我不应该弹出任何错误对话框。知道为什么会发生这种情况吗?

【问题讨论】:

  • 如果我没有要打开的工作簿,我会得到Run time error 1004 Sorry we couldn't find xyz is it possible it was moved, renamed or deleted?(Excel 2013),没有错误处理,并且使用 goto errhandle 可以按预期工作。
  • 你在代码上有一些标签,我猜你要跳回去。为什么不显示相关的错误处理代码?特别是尝试将执行引导回标签的代码....
  • 我建议一种更健壮(即不依赖错误处理程序作为代码逻辑的一部分)的方法是使用Dir 函数来确定文件是否存在。不要将错误处理用作逻辑的一部分。错误处理程序是“错误捕获所有”,它们不是程序逻辑。

标签: excel vba error-handling


【解决方案1】:

如果在错误处理部分引发错误,它不会被任何错误处理代码捕获,并会生成标准 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 逐步浏览我的示例。

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

【讨论】:

  • 我使用 F8 单步执行我的代码,这就是我知道它在进入错误处理程序之前发生的方式。我没有展示我在错误处理程序中所做的主要有两个原因:1)因为它很长而且并不真正相关,2)它有效。问题是,即使在进入错误处理程序之前,我仍然会看到错误对话框。我点击确定,然后进入错误处理程序并打开正确的书。我决定按照其他人的建议去检查 FileName 是否为空,但我仍然对为什么当我告诉 vba 执行错误操作时出现对话框感到困惑。
  • 哇,奇怪。您可以在 Err 中添加一个手表,以查看单步执行代码时发生的情况。也许arrPlanPeriods 以错误处理状态返回?尝试在不调用函数的情况下将strPlan 设置为常量字符串,看看是否会弹出相同的错误。问题是,我无法重现问题,所以我真的无法确定问题所在。
  • 所以这里是陌生的部分:我尝试在家里使用完全相同的代码,但没有弹出错误对话框!在家里我有 Excel 2016,我认为我的工作使用 Excel 2013,所以我想这可能是我偶然发现的某种旧错误?
  • Emm,您知道ToolsOptionsGeneral 有一个名为Error Trapping 的设置吗?确保它不是Break on All Errors。让我将其添加到答案中。
  • 我会在周一上班的时候试试这个,然后告诉你,谢谢!
【解决方案2】:

有两种方法可以解决您的问题。
第一个是使用

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

希望这能让你开心。

【讨论】:

  • 谢谢,我决定选择第二个选项。我仍然对为什么会出现错误框感到困惑,我以前从未见过它在使用“On Error Goto”时弹出
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
  • 1970-01-01
  • 2017-09-22
  • 2012-08-07
  • 1970-01-01
  • 2022-12-12
相关资源
最近更新 更多