我是VBA的新手。我搜索了很长时间才找到一种方法来获得无限(不同)数量的ActiveX复选框,但是没有相应数量的_click subs但是我无法使它工作。
我以为我找到了使用Form Controls的方法,但它似乎并不完美。这是我单击cbxReady的代码(项目准备就绪时的复选框,只有勾选cbxStart时才能勾选):
LastRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
For s = 1 To LastRow - 2
If ActiveSheet.CheckBoxes("cbxReady" & s).Value = 1 Then
ActiveSheet.Cells(s + 2, "A").Interior.Color = RGB(255, 255, 0)
ElseIf ActiveSheet.CheckBoxes("cbxReady" & s).Value = -4146 Then
ActiveSheet.Cells(s + 2, "A").Interior.Color = RGB(218, 238, 243)
End If
Next
这是cbxStart:
LastRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
For s = 1 To LastRow - 2
If ActiveSheet.CheckBoxes("cbxStart" & s).Value = 1 Then
ActiveSheet.Cells(s + 2, "A").Interior.Color = RGB(218, 238, 243)
With ActiveSheet.CheckBoxes("cbxReady" & s)
.Enabled = True
.Value = -4146
End With
ElseIf ActiveSheet.CheckBoxes("cbxStart" & s).Value = -4146 Then
ActiveSheet.Cells(s + 2, "A").Interior.Color = RGB(255, 0, 0)
With ActiveSheet.CheckBoxes("cbxReady" & s)
.Enabled = False
.Value = 2
End With
End If
Next
这个想法是复选框被命名为cbxStart和cbxReady从1到任意,当我点击cbxStart时,A列中的单元格(通过颜色编码指示项目的状态)将变为蓝色,然后如果我单击cbxReady然后它会变黄。到现在为止还挺好。
然而,这发生了:
第一行,两者都勾选,颜色为黄色,一切都很好;
第二行,两者都未被攻击,我勾选cbxStart,它变成蓝色但是第一行也变为蓝色,以及它的cbxReady取消。
所以基本上,即使复选框的命名方式不同,每个复选框都会对untick事件做出反应。
有人可以帮帮我吗?如果使用ActiveX更容易,我也很感激,我只想每个复选框类型有一个代码,因为我不知道我将拥有多少代码,我希望他们引用一个cbxStart_click()和一个cbxReady_click()。
谢谢!
答案 0 :(得分:0)
这样做的诀窍是拥有一个处理Click事件的类。
MyCheckBox类
Private WithEvents Check As MSForms.CheckBox
Private Sub Check_Click()
MsgBox Check.Object.Value
End Sub
Public Sub SetCheckBox(ck As OLEObject)
Set Check = ck.Object
End Sub
接下来,您需要将每个检查添加到新的MyCheckBox类,并将MyCheckBox添加到模块级别集合。
Public Checks As Collection
Private Sub AddCheckboxes()
Dim o As OLEObject
Dim ck As MyCheckBox
Set Checks = New Collection
For Each o In ActiveSheet.OLEObjects
Set ck = New MyCheckBox
ck.SetCheckBox o
Checks.Add ck
Next
End Sub
现在,只要点击一个复选框,就会调用Private Sub Check_Click()
。