【发布时间】:2016-02-02 22:06:56
【问题描述】:
我有一个包含很多电子邮件地址的用户表单。我希望用户能够选择向谁发送电子邮件。我使用在运行时创建的复选框来执行此操作。为了更容易使用,我还添加了一个复选框,允许用户选择或取消选择所有复选框。
这完全符合我的要求,但有一个问题让我很头疼。如果所有复选框都被选中并且一个未被选中,我希望“全选”复选框也被取消选中 - 反之亦然,如果不是所有复选框都被选中并且最终复选框正在被用户选中,我想要“全选” " 复选框也被选中。
我尝试使用类模块来做到这一点。我对 vba 的总体了解还不错,但是类模块对我来说是新领域,所以如果我的语言现在变得有点挑剔,请见谅。
在用户窗体的初始化事件中,我创建了一个新集合并将点击分配给这些特定的复选框。这非常有效,因为它不会在用户窗体的初始化事件中出现任何错误,并且一旦我单击这些复选框之一就会触发一个事件。我遇到的问题是我无法掌握用户表单中的“全选”复选框(chkSelAll)。我已经尝试在用户表单中为这个复选框创建一个公共对象(Public objSelAll As MSForms.CheckBox),但是一旦我单击其中一个复选框,它仍然会给我“变量未定义”错误。
这是类模块 (cls_RIRI) 的代码:
Private WithEvents chkBox As MSForms.CheckBox
Public Sub AssignClicks(ctrl As Control)
Set chkBox = ctrl
End Sub
Private Sub chkBox_Click()
If chkBox.Value = False Then objSelAll.Value = False
'^This is where the error occurs: variable not defined
End Sub
这是 Userform_Initialize 事件的相关部分:
Private colTickBoxes As Collection
Public objSelAll As MSForms.CheckBox
Private Sub UserForm_Initialize()
Dim ChkBoxes As cls_RIRI
Dim ctrl As Control
Set objSelAll = Me.Controls.Item("chkSelAll")
Set colTickBoxes = New Collection
For Each ctrl In Me.Controls
If TypeName(ctrl) = "CheckBox" And Left(ctrl.Name, 1) = "M" Then
Set ChkBoxes = New cls_RIRI
ChkBoxes.AssignClicks ctrl
colTickBoxes.Add ChkBoxes
End If
Next ctrl
Set ChkBoxes = Nothing
Set ctrl = Nothing
End Sub
如您所见,我还没有到让代码检查是否选中所有复选框的地步,以便也可以选中全选复选框。我并不是真的在寻找这段代码,一旦我掌握了类模块中的全选复选框,我可能会管理它,所以请不要担心这部分! :)
【问题讨论】: