【问题标题】:How can I use .OnAction for an ActiveX Checkbox如何将 .OnAction 用于 ActiveX 复选框
【发布时间】:2017-04-16 12:34:20
【问题描述】:

我有一个按钮,可以根据用户选择的单元格范围生成 ActiveX 复选框。这些复选框链接到它们对应的单元格。此外,还会生成一个主复选框,用于选中/取消选中其余复选框。

我要做的是在选中此主复选框并最终检查其余部分时发生事件。

我在想这样的事情,那就是创建我的主复选框:

Sub AddMasterCheckbox(cbNum As Integer, cbIdent As String, Rng As Range)
Dim name
With ActiveSheet.OLEObjects.Add(ClassType:="Forms.CheckBox.1", _
    Left:=1033.5, Top:=Rng.Top, Width:=150.5, Height:=20.75)
    If cbNum < 10 Then
        .name = "NewCheckBox" & cbIdent & "0" & cbNum
    Else
        .name = "NewCheckBox" & cbIdent & cbNum
    End If
    name = .name
    .Object.Caption = "Select all for this Machine"
    .Object.OnAction = "'SelectAll ""name""'"
End With
End Sub

但是,我收到一条错误消息,指出不支持此功能。 本质上,我还有另一个名为 SelectAll 的子程序,理想情况下,它会在单击主复选框时被调用。

我该怎么做呢?

【问题讨论】:

  • 我不知道这是否能解决任何问题,但你应该有.Object.OnAction = "'SelectAll """ &amp; name &amp; """'"

标签: excel vba checkbox


【解决方案1】:

ActiveX 控件没有.OnAction 方法。仅供参考:Forms.CheckBox.1 指的是 MS 表单复选框,而不是 Excel 表单控件。

或者,您可以使用 Excel 表单控件:

Sub AddMasterCheckbox(cbNum As Integer, cbIdent As String, Rng As Range)
    Dim name
    With ActiveSheet.CheckBoxes.Add(Left:=1033.5, Top:=Rng.Top, Width:=150.5, Height:=20.75)
        If cbNum < 10 Then
            .name = "NewCheckBox" & cbIdent & "0" & cbNum
        Else
            .name = "NewCheckBox" & cbIdent & cbNum
        End If
        name = .name
        .Caption = "Select all for this Machine"
        .OnAction = "'SelectAll ""name""'"
    End With
End Sub

注意:如果您更喜欢使用 ActiveX 控件,您可以使用用户定义的类来对 CControls 事件进行分组。查看我对Returning an index value from a group of ActiveX Option Buttons的回复

【讨论】:

    【解决方案2】:

    最简单的解决方案是简单地使用表单控件而不是 ActiveX 控件。那就是……

    ActiveSheet.OLEObjects.Add 的结果将是一个OLEObject,其中包含一个MSForms.CheckBox 作为它的.Object。它没有OnAction 成员。

    但是,它确实提供了源自动化事件(如果没有它们,它在表单上将毫无价值)。这意味着您可以获取引用、存储它并处理它的事件:

    'This code can't be in a module.
    Private WithEvents master As MSForms.CheckBox
    
    Sub AddMasterCheckbox(cbNum As Integer, cbIdent As String, Rng As Range)
        Set master = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CheckBox.1", _
                        Left:=1033.5, Top:=Rng.Top, Width:=150.5, Height:=20.75).Object
        With master
            If cbNum < 10 Then
                .Name = "NewCheckBox" & cbIdent & "0" & cbNum
            Else
                .Name = "NewCheckBox" & cbIdent & cbNum
            End If
            Name = .Name
            .Object.Caption = "Select all for this Machine"
        End With
    End Sub
    
    Private Sub master_Change()
        SelectAll master.Name
    End Sub
    

    请注意,事件处理程序的生命周期将是您存储 master 的任何类的生命周期。如果您需要在工作簿关闭后“重新连接”它,您需要在Workbook_Open 或在复选框可访问之前触发的其他处理程序中执行此操作。如果是这种情况,创建一个简单的包装类可能会更好:

    'In a class module named CheckboxWrapper.
    Private WithEvents m_wrapped As MSForms.CheckBox
    
    Public Property Get WrappedCheckBox() As MSForms.CheckBox
        Set WrappedCheckBox = m_wrapped
    End Property
    
    Public Sub GenerateCheckbox(cbNum As Integer, cbIdent As String, Rng As Range)
        Set m_wrapped = Rng.Parent.OLEObjects.Add(ClassType:="Forms.CheckBox.1", _
                        Left:=1033.5, Top:=Rng.Top, Width:=150.5, Height:=20.75).Object
    
        With m_wrapped
            If cbNum < 10 Then
                .Name = "NewCheckBox" & cbIdent & "0" & cbNum
            Else
                .Name = "NewCheckBox" & cbIdent & cbNum
            End If
            .Object.Caption = "Select all for this Machine"
        End With
    End Sub
    
    Private Sub m_wrapped_Change()
        SelectAll master.Name
    End Sub
    

    你会像这样使用它:

    Private checkboxes As Collection
    
    Private Sub Workbook_Open()
        Dim ole As OLEObject
        For Each ole In Sheet1.OLEObjects   'Or whatever sheet they're on
            If TypeName(cbx) = "CheckBox" Then
                Dim cbx As CheckboxWrapper
                Set cbx = New CheckboxWrapper
                Set cbx.WrappedCheckBox = ole.Object
                checkboxes.Add cbx
            End If
        Next
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2017-07-11
      • 1970-01-01
      • 2021-07-25
      • 1970-01-01
      • 2012-06-28
      • 2016-12-22
      • 2013-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多