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

Dynamically add checkboxes and event handler to a worksheet

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

我需要能够做到以下几点: - 将事件 (onclick) 处理为 ticking/unticking 另一个 sheet 中的复选框 hides/unhides 行 - return 当我循环浏览另一个模块中的复选框时每个复选框的状态(来自命令框的 onclick)并根据状态执行操作 - 修改每个复选框的状态,因为我有 1 个命令框来勾选它们,1 个命令框来取消勾选它们

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

我试图创建一个代码来动态添加复选框并创建一个 class 模块来处理事件,但我真的卡住了.. 我复制并修改了一些最初用于用户窗体的代码,我设法让它在用户窗体上工作,但我宁愿像上面描述的那样工作sheet。

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

Option Explicit
Public WithEvents cBox As MSForms.CheckBox

Private Sub cBox_Click()
MsgBox cBox.Name
End Sub

这是我作为模块编写的代码。我计划将它放在一个命令按钮的事件 (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

我对以下问题的回答: 看来它很适合你。

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