将复选框和事件处理程序动态添加到工作表
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
在 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