多个复选框单击事件

时间:2018-02-20 11:04:53

标签: excel vba activexobject

我有代码检查是否已检查单元格中的每个复选框,如果是,则相应地更改单元格背景颜色。

我有一张包含900个ActiveX复选框的工作表,每个单元格有18个复选框,可能会添加更多复选框,我不想写900加上私有子复选框#_Click( )'事件。有没有办法为所有人写一次事件?

2 个答案:

答案 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