Excel VBA中CheckBox1_Click事件陷入死循环,求原因分析
问题:CheckBox点击事件陷入死循环的原因
点击CheckBox1时代码陷入死循环,单步调试会交替执行两条TextBox1.Value赋值语句,且复选框无可见状态更新。代码如下:
Private Sub CheckBox1_Click() Select Case CheckBox1 Case True CheckBox1 = False TextBox1.Value = "" Case False CheckBox1 = True TextBox1.Value = InputBox("What order do you want " & CheckBox1.Caption & " to be sorted in? ie 1, 2, 3...", "Sort Order") End Select End Sub
原因分析与解决办法
死循环的核心原因
在CheckBox1_Click事件过程中直接修改CheckBox1的状态(CheckBox1 = True/False)时,这个赋值操作会自动触发CheckBox1_Click事件,导致事件递归调用,形成死循环:
- 第一次点击CheckBox1,若初始状态为False,进入
Case False分支,执行CheckBox1 = True,触发第二次CheckBox1_Click事件; - 第二次事件触发时,CheckBox1状态变为True,进入
Case True分支,执行CheckBox1 = False,又触发第三次CheckBox1_Click事件; - 如此反复交替触发两个分支,形成无限递归,所以会交替执行两条TextBox赋值语句,且复选框状态还没来得及渲染就被再次修改,导致看不到状态变化。
解决办法
修改CheckBox状态前先禁用事件触发,完成后再恢复,就能避免递归调用:
Private Sub CheckBox1_Click() ' 禁用事件触发,防止修改状态时重复调用本事件 Application.EnableEvents = False Select Case CheckBox1 Case True CheckBox1 = False TextBox1.Value = "" Case False CheckBox1 = True TextBox1.Value = InputBox("请输入" & CheckBox1.Caption & "的排序顺序,例如1,2,3...", "排序顺序") End Select ' 恢复事件触发 Application.EnableEvents = True End Sub
内容的提问来源于stack exchange,提问作者tschop
相关产品推荐
相关产品推荐

