Excel VBA 复选框单击和更改事件相同吗?

mik*_*era 7 checkbox excel events vba click

我有 5 个复选框来为宏设置一些选项,其中之一是 Select/Unselect All 复选框。当您选择要删除的邮件或标记为已读等时,我想创建类似于您在基于 Web 的邮箱上拥有的内容。当我选中 Select/Unselect All 复选框时,我将其余复选框的值设为 true,反之亦然当我取消选中它时。没关系。

当我还想验证是否所有内容都未选中并且我逐个选中其他复选框时出现问题,如果最后我选中所有,则选择/取消全选复选框变为选中状态。反之亦然,这意味着如果所有内容都被选中,然后我取消选中其他四个中的一个,那么我将“全部”复选框设置为 false(未选中)。

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

它不应该只是触发 Change 事件,因为我实际上并没有点击那个复选框吗?

发生的情况是我检查了 SelectAll,因此它将 Option1 变为选中状态,但是通过这样做,Option1 也会触发 click 事件,因此它取消选中它再次触发 click 事件,然后再次取消选中最后留下所有内容的 All 复选框未经检查,就像在开始时一样。希望这部分足够清楚。

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

有没有人有过这样的复选框排列并有类似的问题?或者你是如何在没有我得到的行为的情况下做到这一点的?

复选框不在表单上,​​而只是在工作表上。它们是 ActiveX 控件。我所拥有的并不复杂:

Private Sub SelectAll_Click()
    Option1Checkbox.Value = SelectAll.Value
    Option2Checkbox.Value = SelectAll.Value
    Option3Checkbox.Value = SelectAll.Value
    Option4Checkbox.Value = SelectAll.Value
End Sub
Run Code Online (Sandbox Code Playgroud)

然后选项复选框单击事件如下所示:

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
Run Code Online (Sandbox Code Playgroud)

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

谢谢你的帮助。

Res*_*bis 0

我会编写一个子检查是否在 If 语句中检查了 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
Run Code Online (Sandbox Code Playgroud)

结束子

然后我会在复选框的每个 OnClick 事件结束时调用此子程序。