You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:38:12