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
相关产品推荐
相关产品推荐

