VBA:如何使用类模块在userform中更改checkbox的值

时间:2016-02-02 12:12:45

标签: vba excel-vba excel

我有一个带有很多电子邮件地址的用户表单。我希望用户能够选择向谁发送电子邮件。我这样做是在运行时创建的复选框。为了方便使用,我还添加了一个复选框,允许用户选择取消选中所有复选框。

这完全符合我的要求,但有一个问题我正在打破我的头脑。如果选中所有复选框并取消选中一个复选框,我也希望取消选中“全选”复选框 - 反之亦然,如果不是所有复选框都已选中并且用户正在检查最后一个复选框我想要“全选” “也要检查复选框。

我尝试使用类模块执行此操作。我对vba的整体了解还不错,但课程模块对我来说是个新领域,所以请原谅我,如果我的语言现在有点挑剔。

在userform的initialize事件中,我创建了一个新集合,并为这些特定复选框分配了点击次数。这非常有效,因为它不会在userform的initialize事件中出现任何错误,并且在我单击其中一个复选框后会触发事件。我遇到的问题是我无法控制用户窗体中的“全选”复选框(chkSelAll)。我已经尝试在userform(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

正如你所看到的,我还没有达到这一点,我让代码检查是否选中了所有复选框,以便也可以检查全选复选框。我不是真的在寻找这个代码,一旦我掌握了类模块中的select all复选框,我就可以管理它,所以请不要担心这部分! :)

2 个答案:

答案 0 :(得分:1)

Private WithEvents chkBox As MSForms.CheckBox
private strParentFormName as string
Public Sub AssignClicks(ctrl As Control,strFormName as string)
    strParentFormName=strFormName
    .....
end sub

Private Sub chkBox_Click()

    dim f as userform
    set f=userforms(0) <--- or loop the userforms to get form name
    If chkBox.Value = False Then f.controls("objSelAll").Value = False
                                '^This is where the error occurs: variable not defined
End Sub

和类似的东西

Public Function GET_USERFORM(strUserform As String) As UserForm

    Dim i As Integer

    For i = 0 To UserForms.Count - 1
        If UserForms(i).Name = strUserform Then
            Set GET_USERFORM = UserForms(i)
            Exit For
        End If
    Next i

End Function

答案 1 :(得分:0)

您还需要传递表单,因为该类中的变量不存在。为formname添加一个属性,或者如果你只打开一个表单,那么如果打开了多个表单,则使用打开的表单或引用表单。您的班级作为复选框存在于其自己的位置。我不确定,但您可以从复选框中获取父对象。希望这会有所帮助。

private strFormName as string
Public Property Let ParentForm(value as string)
      strFormname=value
End Property

...然后

   userforms(strFormname).controls("objSelectAll").value=true