Excel VBAcheckbox单击并更改事件相同?

我有5个checkbox为macros设置了一些选项,其中一个是Select / Unselect Allcheckbox。 当你select邮件删除或标记为已读等,我想创build类似于基于Web的邮箱的东西。当我检查select/取消全选checkbox,我把其余的checkbox的值为true,反之亦然当我取消选中。 没关系。

问题来了,当我也想validation,如果一切都没有检查,并逐一检查其他checkbox,如果最后我检查所有,然后select/取消select所有checkbox转到检查。 反之亦然,这意味着如果eveything被检查,然后取消其他四个之一,那么我将“All”checkbox设置为false(未选中)。

但是,似乎即使我只是设置了值,例如Option1Checkbox.value = True,在SelectAllCheckbox_Click事件中,它也触发了Option1Checkbox_Click和Option1Checkbox_Change事件。

不应该只是触发Change事件,因为我实际上没有点击该checkbox?

会发生什么事是我检查SelectAll,所以它将Option1选中,但是通过这样做,Option1也会触发click事件,所以它取消选中它再次触发click事件,然后再次取消选中Allcheckbox,最后留下一切没有检查,就像开始时一样。 希望这部分足够清楚。

我怎样才能避免这种行为? 我如何确保只有Change事件被触发,而不是Click事件?

有没有人有过这样的checkbox安排,并有类似的问题? 或者你是如何做到这一点,而没有我得到的行为?

checkbox不在窗体上,而只在工作表上。 他们是ActiveX控件。 而我所拥有的并不复杂:

Private Sub SelectAll_Click() Option1Checkbox.Value = SelectAll.Value Option2Checkbox.Value = SelectAll.Value Option3Checkbox.Value = SelectAll.Value Option4Checkbox.Value = SelectAll.Value End Sub 

然后选项checkbox单击事件看起来像这样:

 Private Sub Option1Checkbox_Click() If Option1Checkbox.Value = True And Option2Checkbox.Value = True And Option3Checkbox.Value = True And Option4Checkbox.Value = True Then SelectAll.Value = True Else SelectAll.Value = False End If End Sub 

这很简单,我看到的最大的问题是当checkbox没有实际点击时对点击事件的调用。

谢谢你的帮助。

我会定义一个局部variables(一个在子目录之外定义)并设置/检查

 Option Explicit Dim ImChangingStuff As Boolean Private Sub SelectAll_Click() ImChangingStuff = True Option1Checkbox.Value = SelectAll.Value Option2Checkbox.Value = SelectAll.Value Option3Checkbox.Value = SelectAll.Value Option4Checkbox.Value = SelectAll.Value ImChangingStuff = False End Sub 

那么你的点击例程将如下所示:

 Private Sub Option1Checkbox_Click() If ImChangingStuff Then Exit Sub If Option1Checkbox.Value = True And Option2Checkbox.Value = True And Option3Checkbox.Value = True And Option4Checkbox.Value = True Then SelectAll.Value = True Else SelectAll.Value = False End If End Sub 

我会写一个子检查,如果Option1到Option4都在一个If语句中检查。 在第二个陈述中,我会检查它们是否全是假的:

 Sub Are_O1_to_O4_All_Checked () If Option1Checkbox.Value = True And _ Option2Checkbox.Value = True And _ Option3Checkbox.Value = True And _ Option4Checkbox.Value = True Then Option5Checkbox.Value = True ' select/unselect checkbox End If If Option1Checkbox.Value = False And _ Option2Checkbox.Value = False And _ Option3Checkbox.Value = False And _ Option4Checkbox.Value = False Then Option5Checkbox.Value = False ' select/unselect checkbox End If 

结束小组

然后我会在checkbox的每个OnClick事件结束时调用此子。

为了解决这个问题,

  1. 在你的主要用户窗体(在这个例子中它被称为主窗体)添加此代码:

    Private Sub Mainform_Initialize()stateCheckbox = True End Sub

  2. 创build一个模块来存储你的全局variables(例如globalVariables ),并添加下面的内容,它将保存checkbox的状态:

    公开stateCheckbox作为布尔值

  3. 在checkbox的_click事件中,将代码包装如下:

    如果stateCheckbox = false那么{无论你的代码是否则} else:stateCheckbox = false end if

我有同样的问题,如上所述。 我认识到每一个checkbox的改变,无论是通过点击还是改变Checkbox.Value ,每次首先触发Checkbox_Change事件,然后触发Checkbox_Click事件,只要这些事件被声明。 因此,我build议每个checkbox只使用一个事件, Checkbox_Change事件,并检查checkbox是否已被更改通过单击或声明在Sub的开始。 这可以通过比较ActiveControl.NameCheckbox.Name来完成:

 Private Sub CheckBox1_Change() On Error Goto Err: If ActiveControl.Name = CheckBox1.Name Then On Error Goto 0 'Commands for click Exit Sub Else On Error Goto 0 'Commands for change from within the Userform Exit Sub Err:On Error Goto 0 'Commands for change from outside the Userform End Sub