将复选框和事件处理程序动态添加到工作表

Thu*_*gle 0 vba dynamic worksheet event-handling

在我的 BI 列中的工作表中有组件名称 在列 AI 中希望有动态添加的复选框,因为 B 列中的名称列表会随着时间的推移而增加

我需要能够执行以下操作: - 处理事件 (onclick) 作为勾选/取消勾选复选框隐藏/取消隐藏另一个工作表中的行 - 在我循环浏览另一个模块中的复选框时返回每个复选框的状态(来自commandbox) 并根据状态是否执行操作 - 修改每个复选框的状态,因为我有 1 个命令框来勾选它们,还有 1 个命令框来取消勾选它们

到目前为止,我有一个工作原型,但我有两个问题:1)复选框没有链接到 A 列中的单元格,它们只是在我创建它们时定位 2)复选框不是动态的,我手动创建它们并且有为每个复选框(> 50 个复选框)编写一个事件处理程序 (onclick)

我试图创建一个代码来动态添加复选框并创建一个类模块来处理事件,但我真的被卡住了..我复制并修改了一些最初用于用户表单的代码,并设法使其在一个userform,但我宁愿将所有内容都放在工作表上,如上所述。

这是类模块代码(命名为:clsBoxEvent)

Option Explicit
Public WithEvents cBox As MSForms.CheckBox

Private Sub cBox_Click()
MsgBox cBox.Name
End Sub
Run Code Online (Sandbox Code Playgroud)

这是我作为模块编写的代码。我打算将它放在一个命令按钮的事件 (onclick) 中,我打算单击该按钮以更新复选框列表。除非这不是必需的,因为有一种方法可以在 B 列中的单元格不为空时立即创建复选框?

我感谢您的意见。

Dim chkBoxEvent As clsBoxEvent
Dim chkBox As MSForms.CheckBox
Dim chkBoxColl As Collection

Private Sub chkBox_update()
Dim i As Integer
Set chkBoxColl = New Collection

For i = 1 To 5
    ' I wrote the code just to add 5 checkboxes as a test. Later I will need to adapt this to the actual required number of checkboxes (the number of products in column B)  

    Set chkBox = Controls.Add("Forms.CheckBox.1", "ChkBox" & i)
    With chkBox
       ' I work with the position as I did not know how to link it to the cells in colums A
        .Left = 126
        .Height = 16
        .Top = 6 + ((i - 1) * 16)
    End With

Set chkBoxEvent = New clsBoxEvent
Set chkBoxEvent.cBox = Controls(chkBox.Name)
chkBoxColl.Add chkBoxEvent

Next i

End Sub
Run Code Online (Sandbox Code Playgroud)

小智 8

我的回答是:Excel VBA 脚本插入多个链接到单元格的复选框,用 yes 和 no 而不是 true 和 false似乎对你来说效果很好。

在此处输入图片说明

Sub AddCheckBoxes()

    Dim cb As CheckBox
    Dim myRange As Range, cel As Range
    Dim wks As Worksheet

    Set wks = Sheets("Sheet1")

    Set myRange = wks.Range("A1:A1000")

    For Each cel In myRange

        Set cb = wks.CheckBoxes.Add(cel.Left, cel.Top, 30, 6)

        With cb
            .Caption = ""
            .OnAction = "ProcessCheckBox"
        End With

    Next

End Sub

Sub ProcessCheckBox()
    Dim cb As CheckBox
    With Sheets("Sheet1")
        Set cb = .CheckBoxes(Application.Caller)
        If Not cb Is Nothing Then cb.TopLeftCell = IIf(cb.Value = 1, "Cleared", "")
    End With
End Sub
Run Code Online (Sandbox Code Playgroud)