【问题标题】:VBA: how to use class module to change value of checkbox in userformVBA:如何使用类模块更改用户表单中复选框的值
【发布时间】: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

如您所见,我还没有到让代码检查是否选中所有复选框的地步,以便也可以选中全选复选框。我并不是真的在寻找这段代码,一旦我掌握了类模块中的全选复选框,我可能会管理它,所以请不要担心这部分! :)

【问题讨论】:

    标签: vba excel


    【解决方案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
    

    【讨论】:

    • 我只需要 userforms(0).controls("chkSelAll").value=false,就这样。无论如何感谢您的帮助!
    【解决方案2】:

    您还需要传递表单,因为该变量在类中不存在。为表单名称添加一个属性,或者如果您只打开 1 个表单,则使用打开的表单或在打开多个表单时引用该表单。您的课程作为一个复选框单独存在。我不确定,但您可以从复选框中获取父对象。希望这会有所帮助。

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

    那么……

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

    【讨论】:

    • 谢谢!您如何建议将其传递给类模块?我尝试以与 objSelAll 相同的方式执行此操作,但不幸的是它给出了相同的结果。
    • 感谢您编辑您的信息!我无法让它工作。我已将您的解决方案复制粘贴到我的课程模块中,现在它给了我一个“类型错误”错误。如果我将您的解决方案复制到用户表单代码中,我会收到与以前相同的错误。我做错了什么?
    猜你喜欢
    • 2020-10-28
    • 1970-01-01
    • 2019-05-12
    • 2018-08-17
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    • 2016-11-05
    相关资源
    最近更新 更多