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

时间:2009-06-17 13:51:01

标签: excel vba excel-vba

继上一个问题之后。

客户的要求是在报告上设置复选框以禁用另一个工作表上的信息行。行被定义为命名范围,由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

那么如何将复选框中的更改与子/函数相关联?

2 个答案:

答案 0 :(得分:6)

只要选中或取消选中复选框,就将Checkboxes对象的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

答案 1 :(得分:1)

我认为Excel.Checkbox控件没有任何可用的事件。请尝试使用MSForms复选框。您需要引用“Microsoft Forms 2.0 Object Library” - 它不可重新分发,但如果您使用的是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

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