多个复选框点击事件

multiple checkbox click events

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

我有一个 sheet 启用了 900 个 ActiveX 复选框,每个单元格有 18 个复选框,还可以添加更多,我不想写 900 多个 'Private Sub CheckBox#_Click()' 事件.有没有办法为所有这些写一次事件?

我不确定你的想法是什么,但我希望你能根据你的需要调整这段代码。

首先,如果您所有的复选框都命名为 "Check box 1"、"Check box 2" 等,则此代码 有效。如果没有,您将需要找出一种不同的方法。

此代码将选中 ActivetSheet 中的所有复选框。如果所有复选框的值为真,它将执行某些操作,如果任何复选框为假,则执行其他操作。

根据您的需要调整代码。

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

使用 VBA Class 模块可以声明成员 WithEvents。所以可以为多个可以有事件的对象建立一个"event handler"。

创建一个新的 class 模块并将其命名为 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

并且在带有复选框的 sheet 的代码模块中确实有以下代码:

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

现在,每次 sheet 被激活时,Private Sub Worksheet_Activate() 运行并为每个复选框启动 class CBEvents 的一个对象,并将其放入数组 aCBEvents。然后,点击事件将从 class CBEventsPrivate Sub oCB_Click() 开始处理。

注意:重新打开工作簿后,sheet必须至少激活一次。所以如果 sheet 不是第一个就好了。否则您需要至少停用和激活它一次。