MS Access 2016:取消查询时的2001错误处理方案咨询
解决MS Access 2001错误:用户取消查询时保持窗体原有状态
嘿,这个问题我之前维护Access窗体的时候也踩过坑!2001错误本质就是用户中断了查询操作(比如弹出参数输入对话框时点击了取消),这时候DoCmd.Requery会直接抛出系统错误,我们只需要通过错误捕获来处理这个场景,就能让窗体稳稳保持原来的状态。
下面是两种可行的解决方案,推荐第一种结构化错误处理的方式,代码更清晰易维护:
方案一:结构化错误捕获(推荐)
把按钮的点击事件代码改成这样,专门捕获2001错误:
Private Sub btnRequery_Click() On Error GoTo ErrorHandler ' 先保存未提交的修改(避免Requery时触发意外的保存提示) If Me.Dirty Then Me.Dirty = False End If ' 执行重新查询操作 DoCmd.Requery ' 正常执行完成后直接退出,不进入错误处理块 Exit Sub ErrorHandler: ' 针对用户取消操作的2001错误做处理 If Err.Number = 2001 Then ' 这里可以给个友好提示,也可以什么都不做(保持窗体原样) MsgBox "你取消了查询操作,窗体将维持当前状态。", vbInformation Else ' 其他未知错误,给出具体提示方便排查 MsgBox "发生未预期错误:" & Err.Description & "(错误代码:" & Err.Number & ")", vbExclamation End If ' 重置错误处理机制,恢复系统默认的错误提示行为 On Error GoTo 0 End Sub
方案二:简化版错误捕获(快速实现)
如果你的按钮逻辑很简单,也可以用On Error Resume Next快速处理:
Private Sub btnRequery_Click() On Error Resume Next ' 保存未提交修改 If Me.Dirty Then Me.Dirty = False ' 执行查询 DoCmd.Requery ' 判断错误类型 Select Case Err.Number Case 2001 MsgBox "查询已取消,窗体状态不变。", vbInfo Case Is <> 0 MsgBox "错误信息:" & Err.Description, vbExclamation End Select On Error GoTo 0 End Sub
关键说明:
Me.Dirty的判断是为了避免Requery时弹出保存提示,如果你确认窗体不会有未保存的修改,这一步可以省略,但加上更稳妥。- 捕获2001错误后,我们不需要做任何改变窗体状态的操作——因为用户取消时,Access已经中断了Requery,窗体本来就还停留在原来的状态,我们只需要屏蔽掉系统自带的错误提示即可。
内容的提问来源于stack exchange,提问作者darsh
相关产品推荐
相关产品推荐

