我有代码检查是否已检查单元格中的每个复选框,如果是,则相应地更改单元格背景颜色。
我有一张包含900个ActiveX复选框的工作表,每个单元格有18个复选框,可能会添加更多复选框,我不想写900加上私有子复选框#_Click( )'事件。有没有办法为所有人写一次事件?
答案 0 :(得分:1)
使用VBA
类模块,可以将成员声明为WithEvents
。因此,可以为可以有事件的多个对象建立一个“事件处理程序”。
创建新的类模块并命名为CBEvents
。有以下代码:
Option Explicit
Private WithEvents oCB As MSForms.CheckBox
Public Property Set CB(obj As MSForms.CheckBox)
Set oCB = obj
End Property
Private Sub oCB_Click()
MsgBox oCB.Caption & " was clicked."
End Sub
注意:必须添加对Microsoft Forms 2.0 Object Library
的引用。如果您要插入UserForm
,将自动完成。
在默认代码模块中,请执行以下代码:
Option Explicit
Public aCBEvents() As CBEvents
在工作表的代码模块中,复选框中包含以下代码:
Option Explicit
Private Sub Worksheet_Activate()
Dim oCBEvents As CBEvents
Dim oleO As OLEObject
Dim i As Long
i = 0
For Each oleO In Me.OLEObjects
If TypeName(oleO.Object) = "CheckBox" Then
Set oCBEvents = New CBEvents
Set oCBEvents.CB = oleO.Object
ReDim Preserve aCBEvents(i)
Set aCBEvents(i) = oCBEvents
i = i + 1
End If
Next
End Sub
现在,每次激活工作表时,Private Sub Worksheet_Activate()
都会运行并为每个复选框启动一个类CBEvents
的对象,并将其放入数组aCBEvents
中。之后,点击事件将从课程Private Sub oCB_Click()
的{{1}}处理。
注意:重新打开工作簿后,必须至少激活一次工作表。如果表格不是第一张,那就太好了。否则,您需要至少停用一次并激活它。
答案 1 :(得分:0)
我不确定您的想法是什么,但我希望您可以根据自己的需要调整此代码。
首先,如果您的所有复选框都命名为&#34;此复选框<&34>,&#34;复选框2&#34;等等,此代码将 ONLY 上。如果没有,你需要找出一种不同的接近方式。
此代码将检查ActivetSheet中的所有复选框。如果所有这些值的值为true,它将执行某些操作,如果任何复选框为false,则会执行其他操作。
根据您的需要调整代码。
Dim ThisShape As Shape
Dim AllTrue As Boolean
AllTrue = True
For Each ThisShape In ActiveSheet.Shapes
If Left(ThisShape.Name, 9) = "Check Box" Then
'check value
If ThisShape.ControlFormat.Value <> 1 Then 'If CheckBox is false
'a checkbox is false, so not all are true
AllTrue = False
Exit For
End If
End If
Next ThisShape
If AllTrue = True Then
'If all checkboxes are true then do whatever you want to do
Else
'If ANY checkbox is NOT true, then do other stuff
End If