7

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

当我还想验证是否所有内容都未选中并且我一个一个地检查其他复选框时,问题就出现了,如果最后我选中了所有复选框,那么 Select/Unselect All 复选框将变为选中状态。反之亦然,这意味着如果所有内容都被选中,然后我取消选中其他四个中的一个,那么我将“全部”复选框设置为 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

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

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

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

谢谢你的帮助。

4

4 回答 4

2

我会定义一个局部变量(在 subs 之外定义的)并设置/检查

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
于 2013-08-08T17:37:24.083 回答
2

我遇到了与上述相同的问题。我认识到 Checkbox 的每次更改,无论是通过 click 还是通过更改Checkbox.Value,每次都首先触发Checkbox_Change事件,然后触发Checkbox_Click事件,前提是声明了这些事件中的任何一个。因此,我建议每个复选框只使用一个事件,peCheckbox_Change事件,并检查复选框是否已通过单击或在Sub. 这可以通过比较ActiveControl.Name与来完成Checkbox.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    
于 2016-07-20T08:57:18.133 回答
2

为了解决这个问题,

  1. 在您的主用户表单(在本例中称为 Mainform)中添加以下代码:

    Private Sub Mainform_Initialize() stateCheckbox = True End Sub

  2. 创建一个模块来存储您的全局变量(例如globalVariables),并添加以下内容,它将保存复选框的状态:

    公共状态复选框为布尔值

  3. 在复选框的 _click 事件中,像这样包装您的代码:

    if stateCheckbox = false then { 不管你的代码是什么 } Else: stateCheckbox = false end if

于 2016-02-10T21:37:31.563 回答
0

如果 Option1 到 Option4 都在 If 语句中检查,我会编写一个子检查。在第二个 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

结束子

然后我会在每个 OnClick 事件结束时为复选框调用这个子。

于 2013-08-08T12:01:08.703 回答