通过VBA检测对复选框的更改

通过VBA检测对复选框的更改,vba,excel,Vba,Excel,继续我上一个问题 客户的一个要求是在报表上设置复选框,以禁用另一张表上的信息行。这些行定义为命名范围,格式为P_XXXXXX。XXXXXX是一个唯一标识符,也是行中的一个字段,因此我可以轻松地动态生成范围名称 我遇到的问题是: 单击项目并关闭表单后,Excel会询问是否要保存。这是不可取的 我需要某种方法来注册在生成的复选框上发生的更改事件。因此,如果有一个或多个更改,我可以运行并隐藏/取消隐藏相关范围 我添加复选框的代码如下所示: ' For each row...

继续我上一个问题

客户的一个要求是在报表上设置复选框,以禁用另一张表上的信息行。这些行定义为命名范围,格式为P_XXXXXX。XXXXXX是一个唯一标识符,也是行中的一个字段,因此我可以轻松地动态生成范围名称

我遇到的问题是:

  • 单击项目并关闭表单后,Excel会询问是否要保存。这是不可取的
我需要某种方法来注册在生成的复选框上发生的更改事件。因此,如果有一个或多个更改,我可以运行并隐藏/取消隐藏相关范围

我添加复选框的代码如下所示:

        ' For each row...

        ' check box in column 17(=Q).
        Dim lCenter As Long
        lCenter = rngCurrent.Width / 4 ' not actual centre but close enough
        With ActiveSheet.CheckBoxes.Add(rngCurrent.Left + lCenter, rngCurrent.Top - 2, rngCurrent.Width, rngCurrent.Height)
            .Interior.ColorIndex = xlNone
            .Caption = ""
        End With

那么如何将复选框中的更改与子/函数链接?

我认为Excel.checkbox控件没有任何可用的事件。尝试改用MSForms复选框。您需要一个对“Microsoft Forms 2.0对象库”的引用,它是不可重新分发的,但如果您使用的是VBA,那么就可以了

然后,您可以执行类似的操作,并以通常的方式处理事件:

''class level
Private WithEvents m_Checkbox as MSForms.CheckBox

Public Sub MakeCheckbox()
    Set m_Checkbox = Activesheet.OLEObjects.Add("Forms.Checkbox.1")
End Sub

Private Sub m_Checkbox_Click()
    ''Do stuff
End Sub

显然,您只能以这种方式处理一组复选框-我建议创建一个类来保存每个复选框。

我认为Excel.checkbox控件没有任何可用的事件。尝试改用MSForms复选框。您需要一个对“Microsoft Forms 2.0对象库”的引用,它是不可重新分发的,但如果您使用的是VBA,那么就可以了

然后,您可以执行类似的操作,并以通常的方式处理事件:

''class level
Private WithEvents m_Checkbox as MSForms.CheckBox

Public Sub MakeCheckbox()
    Set m_Checkbox = Activesheet.OLEObjects.Add("Forms.Checkbox.1")
End Sub

Private Sub m_Checkbox_Click()
    ''Do stuff
End Sub

显然,您只能以这种方式处理一组复选框-我建议创建一个类来保存每个复选框。

将复选框对象的OnAction属性设置为选中或取消选中复选框时要运行的子对象的名称

Sub MakeCB()

    With ActiveSheet.CheckBoxes.Add(ActiveCell.Left + 0, ActiveCell.Top - 2, ActiveCell.Width, ActiveCell.Height)
        .Interior.ColorIndex = xlNone
        .Caption = ""
        .OnAction = "CheckboxChange"
    End With

End Sub

Sub CheckboxChange()

    MsgBox "change"

End Sub

将复选框对象的OnAction属性设置为选中或取消选中复选框时要运行的子对象的名称

Sub MakeCB()

    With ActiveSheet.CheckBoxes.Add(ActiveCell.Left + 0, ActiveCell.Top - 2, ActiveCell.Width, ActiveCell.Height)
        .Interior.ColorIndex = xlNone
        .Caption = ""
        .OnAction = "CheckboxChange"
    End With

End Sub

Sub CheckboxChange()

    MsgBox "change"

End Sub

我将CheckboxChange()放在模块和工作表codebhind中,但两者都给出了错误“无法运行宏'ent\u cc\u new\u pb.xls!复选框“更改”。该宏可能在此工作簿中不可用,或者可能已禁用所有宏”。然而,在打开工作簿时,我可以选择启用宏,我同意这一点。有什么想法吗?上面的两个潜艇都是标准模块。在工作簿处于活动状态的excel中,按Alt+F8打开“宏”对话框。将“中的宏”下拉列表更改为此工作簿,并确保复选框Change显示在列表中。如果没有,您可能意外地在错误的项目中编写了宏。最优秀的例子是Dick Kusleika。与我一直使用的“ActiveSheet.OLEObjects.Add=”方法相比,我现在对复选框的控制非常有用,而且更加整洁。大拇指朝上我把CheckboxChange()放在模块和工作表代码后面,但都给出了错误“无法运行宏'ent\u cc\u new\u pb.xls!复选框“更改”。该宏可能在此工作簿中不可用,或者可能已禁用所有宏”。然而,在打开工作簿时,我可以选择启用宏,我同意这一点。有什么想法吗?上面的两个潜艇都是标准模块。在工作簿处于活动状态的excel中,按Alt+F8打开“宏”对话框。将“中的宏”下拉列表更改为此工作簿,并确保复选框Change显示在列表中。如果没有,您可能意外地在错误的项目中编写了宏。最优秀的例子是Dick Kusleika。与我一直使用的“ActiveSheet.OLEObjects.Add=”方法相比,我现在对复选框的控制非常有用,而且更加整洁。竖起大拇指