如何在卸载UserForm时绕过重复值校验的Exit事件?
解决UserForm卸载时触发Exit校验事件的问题
这问题我之前也碰到过,核心原因是卸载UserForm时,所有控件会依次失去焦点,触发各自的Exit事件,而你在事件里设置了Cancel = True,这会强制焦点回到ItemName文本框,直接阻止了窗体的卸载流程。
之前用布尔变量没生效,大概率是变量作用域不对,或者没在正确的时机设置标志。下面给你一个可靠的解决方案:
步骤1:添加模块级的卸载标志
在UserForm代码模块的最顶部(所有事件之外)声明一个私有布尔变量,用来标记窗体是否正在卸载:
Private IsUnloading As Boolean
步骤2:在窗体关闭前设置标志
添加UserForm_QueryClose事件,这个事件会在窗体开始关闭流程时触发(早于控件的Exit事件),在这里把卸载标志设为True:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) ' 标记窗体正在卸载,让Exit事件跳过校验 IsUnloading = True End Sub
步骤3:修改Exit事件跳过校验
在原来的ItemName_exit事件开头,先判断卸载标志,如果是True就直接退出事件,不执行重复值校验:
Private Sub ItemName_exit(ByVal Cancel As MSForms.ReturnBoolean) ' 如果窗体正在卸载,直接跳过校验逻辑 If IsUnloading Then Exit Sub ' 原有的重复值校验逻辑 If Application.WorksheetFunction.CountIf(Worksheets(2).Range("B6:B505"), ItemName.Text) > 0 Then MsgBox "Duplicate value, please change the name.", vbOKOnly, "Duplicate" Cancel = True Exit Sub End If End Sub
额外说明
- 这个方法对多个校验事件都适用,只需要在每个Exit事件开头加上
If IsUnloading Then Exit Sub即可。 QueryClose事件会覆盖所有关闭场景:点击窗体右上角的叉号、调用Unload Me、甚至任务管理器关闭,都能正确触发标志设置。
内容的提问来源于stack exchange,提问作者user10097577
相关产品推荐
相关产品推荐

