我有一个带有很多电子邮件地址的用户表单。我希望用户能够选择向谁发送电子邮件。我这样做是在运行时创建的复选框。为了方便使用,我还添加了一个复选框,允许用户选择取消选中所有复选框。
这完全符合我的要求,但有一个问题我正在打破我的头脑。如果选中所有复选框并取消选中一个复选框,我也希望取消选中“全选”复选框 - 反之亦然,如果不是所有复选框都已选中并且用户正在检查最后一个复选框我想要“全选” “也要检查复选框。
我尝试使用类模块执行此操作。我对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复选框,我就可以管理它,所以请不要担心这部分! :)
答案 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