ErrorHandler停止在ms访问中捕获错误

时间:2016-07-07 21:07:56

标签: vba ms-access

很抱歉标题含糊不清但我不知道如何在标题中描述我的问题,无论如何,我的长代码中有一部分会触发保存对话框:

Line1:
Dim dlgSaveAs As Object
Dim strFilePath As String
Dim strFileName As String
Set dlgSaveAs = Application.FileDialog(2)
With dlgSaveAs
.InitialFileName = (CurrentProject.Path) & "\Folder" & "_" & Format(Date, "yyyy")
End With
dlgSaveAs.Show
strFilePath = dlgSaveAs.SelectedItems(1)
strFileName = Right(strFilePath, Len(strFilePath) - InStrRev(strFilePath, "\"))
ActiveWorkbook.SaveAs FileName:=CurrentProject.Path & "\" & strFileName, FileFormat:=xlOpenXMLWorkbook

SaveError:
   Select Case Err.Number
   Case 1004 'if it's want to overwrite an old file and i clicked "no" or "cancel" 
      GoTo Line1 'reopen the Save Dialog
   Case 5 'if i clicked "cancel" on the Save Dialog
      rs1.Close
      Set rs1 = Nothing
      MsgBox ("Canceled")
      Exit Sub
   End Select

正如我在代码中解释的那样,如果ErrorHandler检测到“1004”错误,它将在关闭后重新打开“保存”对话框。 每次,第一次出现错误'1004'时,处理程序正常检测到它,但在重新打开对话框后(通过ErrorHandler),处理程序停止检测任何“1004”和“5”。 那是为什么?

1 个答案:

答案 0 :(得分:4)

听说过吗?

  

GOTO IS EVIL

嗯,GoTo是邪恶的。

首先,在程序的顶部粘贴On Error GoTo SaveError - 这将确保错误正确跳转

当第一次出现错误1004时,VBA进入"错误处理模式",并进入SaveError子程序。

有几种方法可以让VBA退出"错误处理模式"然后回到"正常执行模式"没有跳出你所处的程序:

  • Resume会重新运行导致错误的语句(在这里注意无限循环!)
  • Resume Next将在导致错误的语句后运行 next 语句
  • Resume {line label}将跳转到指定的标签

请注意,所有这些都涉及Resume关键字。

当您说GoTo Line1时,您重新运行程序,但VBA仍然认为它处理错误

在运行时认为它处理错误时引发的错误肯定不会达到您的预期(正如您已经注意到的那样)。

GoTo Line1替换为Resume Line1

还要考虑在错误处理子例程/标签之前使用Exit SubExit Function ,以便在您进入时只运行该块代码错误状态。

最后,考虑使用.Show函数的返回值来确定对话框是否已取消,而不是依赖于运行时错误。