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

DoCmd.CancelEvent与Cancel=True在事件调用过程中的有效性及执行逻辑问询

Access可取消事件中子过程的Cancel操作有效性及代码执行逻辑

一、子过程中Cancel操作的有效性

1. Cancel = True 的情况

你的示例代码里,DoThis 子过程直接写 Cancel = True 是无效的,还会触发编译错误——因为 Cancel 是 mCbo_DblClick 事件过程的局部参数,DoThis 未接收该参数,无法直接访问修改。

若要通过子过程修改 Cancel 来取消事件,必须将 Cancel 按引用传递给子过程,修改后代码如下:

Private Sub mCbo_DblClick(Cancel As Integer)
    DoThis Cancel
End Sub

Private Sub DoThis(ByRef Cancel As Integer)
    Foo
    Cancel = True
    Bar
End Sub

这种情况下,子过程修改的就是事件过程的 Cancel 参数,能正常取消事件。

2. DoCmd.CancelEvent 的情况

DoCmd.CancelEvent 是直接向当前处理的可取消事件发送取消指令,无论在事件过程本身还是它调用的子过程中执行,都能生效。它不依赖 Cancel 参数,只要处于事件处理的调用链中,就能取消当前事件。

二、执行Cancel操作后的后续代码执行逻辑

Cancel = True 和 DoCmd.CancelEvent 都不会终止后续代码执行——它们仅标记取消事件,不会像 Exit Sub 那样立即停止过程运行。

在你的示例中,执行完取消语句后,Bar 代码仍会正常执行。如果需要终止后续代码,需手动添加 Exit Sub(或 Exit Function),比如:

Private Sub DoThis(ByRef Cancel As Integer)
    Foo
    Cancel = True
    Exit Sub ' 手动终止,Bar不再执行
    Bar
End Sub

内容的提问来源于stack exchange,提问作者ebsf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 00:05:21