很抱歉标题含糊不清但我不知道如何在标题中描述我的问题,无论如何,我的长代码中有一部分会触发保存对话框:
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”。 那是为什么?
答案 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 Sub
或Exit Function
,以便在您进入时只运行该块代码错误状态。
最后,考虑使用.Show
函数的返回值来确定对话框是否已取消,而不是依赖于运行时错误。