【问题标题】:multiple checkbox click events多个复选框单击事件
【发布时间】:2018-02-20 21:18:30
【问题描述】:

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

我有一张带有 900 个 ActiveX 复选框的工作表,每个单元格有 18 个复选框,并且可能会添加更多,我不想编写 900 多个“Private Sub CheckBox#_Click()”事件。有没有办法为所有人编写一次事件?

【问题讨论】:

  • 不是真的,但有点。您可以创建一个将处理事件的类,并为每个控件创建一个包含一个项目的集合(或数组)。

标签: excel vba activexobject


【解决方案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。之后,点击事件将从CBEvents类的Private Sub oCB_Click()处理。

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

【讨论】:

    【解决方案2】:

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

    首先,此代码在您的所有复选框都命名为“复选框 1”、“复选框 2”等情况下才有效。如果没有,您将需要找出不同的接近方式。

    此代码将检查 ActivetSheet 中的所有复选框。如果 ALL 的值为 true,它会做一些事情,如果任何一个复选框为 false,if 会做其他的事情。

    根据您的需要调整代码。

    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
    

    【讨论】:

      猜你喜欢
      • 2021-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 2011-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多