逐步执行代码非常奇怪

时间:2016-08-23 04:46:19

标签: vba ms-word word-vba

我在带有复选框的Word表单上有以下代码。当我选中一个方框时,我想要清除其他方框。因此,当R00已经过检查并检查R01并且我开始逐步完成sub R01_CheckBox_Click()时,它会跳转到sub R00_CheckBox_Click(),然后会跳过几行,然后再回复到sub R01_CheckBox_Click()。我将其更改为_afterupdate()并且正常工作。任何人都可以解释为什么调试器的行为与_click一起使用时的行为?

Private sub R00_CheckBox_Click()
   R00_CheckBox = true
   R01_CheckBox = false
   R02_CheckBox = false
   R03_CheckBox = false
   R04_CheckBox = false
End sub

Private sub R01_CheckBox_Click()
   R00_CheckBox = false
   R01_CheckBox = true
   R02_CheckBox = false
   R03_CheckBox = false
   R04_CheckBox = false
End sub

Private sub R02_CheckBox_Click()
   R00_CheckBox = false
   R01_CheckBox = false
   R02_CheckBox = true
   R03_CheckBox = false
   R04_CheckBox = false
End sub

1 个答案:

答案 0 :(得分:1)

修改以增强解释

这是因为只要您更改其状态(即其Click属性),就会触发复选框Value事件,无论您是在UI上执行还是按代码。

假设从未选中的所有复选框开始,您点击R00_CheckBox一个:

它会触发其Click事件处理程序,该处理程序在不实际更改任何复选框的状态的情况下进行处理,只需检查R00_CheckBox(即设置为True,这就是你在Click事件处理程序中的原因,而所有其他复选框都已设置为False

然后点击R01_CheckBox

  • 会触发其Click事件,其第一个语句为R00_CheckBox = False

    R00_CheckBox当前True,因此会触发R00_CheckBox_Click事件。

    然后您现在暂停 R00_CheckBox_Click事件处理并开始新的R00_CheckBox_Click

    第一个语句是R00_CheckBox = False,但R00_CheckBox当前True,因此您将更改为{{ 1}}因此暂停当前事件处理程序处理并切换到False一个

    ,其第一个语句为R00_CheckBox_Click,然后您再次将其R00_CheckBox = True更改为False,因此暂停当前True事件处理并启动一个全新的

    现在的R00_CheckBox_Click事件再次以R00_CheckBox_Click开始,R00_CheckBox = True 状态,所以这次没有{&1;} t再次触发自身并继续下一个R00_CheckBox语句,然而它会更改R01_CheckBox = False状态,因此暂停当前{{1} } event并开始一个新的R01_CheckBox

    现在R00_CheckBox_Click事件再次以R01_CheckBox_Click开始,更改R01_CheckBox_Click 并触发R00_CheckBox = False事件,因此暂停< / em>本身又开始了另一个全新的R00_CheckBox活动...

    ......然后......然后......

更好地切换到R00_CheckBox_Click控件,其行为正是您想要的控件:当您检查其中一个时,所有其他控件都会自动取消选中。没有所有递归事件处理程序调用

你可以通过查询默认的R00_CheckBox_Click属性来获得他们的状态,如下所示:

OptionButton