VBA excel控制带有1个宏的多个复选框

时间:2017-10-09 10:10:37

标签: excel vba checkbox

我有一个非常简单的宏来隐藏单击时复选框所在的行。它有效,但问题是有很多行。

    Private Sub CheckBox3_Click()
    [3:3].EntireRow.Hidden = CheckBox3.Value
    Range("AB3").Value = True

End Sub

我当然可以为我拥有的每个复选框创建一个单独的宏(所有250个),但我希望我能避免使用6页长的宏。

我的问题是:有没有办法将它合并为1?唯一不同的是数字(在例子中为3)。

1 个答案:

答案 0 :(得分:0)

您应该以编程方式创建这些CheckBox并创建Class Module来处理事件。以下是如何实现它的示例:

ClassModule,即MyCheckBox:

Option Explicit

Dim WithEvents m_CheckBox As MSForms.CheckBox
Dim m_Row As Long
Public Sub CreateCheckBox(ByVal sh As Worksheet, ByVal rowNumber As Long)
    m_Row = rowNumber
    Set m_CheckBox = sh.OLEObjects.Add(ClassType:="Forms.CheckBox.1", Left:=sh.Cells(rowNumber, 1).Left, Top:=sh.Cells(rowNumber, 1).Top, Width:=108, Height:=19.5).Object
End Sub

Private Sub m_CheckBox_Change()

    MsgBox "I'm in row " & m_Row & " MyValue is " & m_CheckBox.Value

End Sub

使用此代码的模块:

Option Explicit

Dim chkBoxes As New Collection

Public Sub test()
Dim sh As Worksheet
Dim chk As MyCheckBox

    Set sh = ActiveSheet

    Set chk = New MyCheckBox
    chk.CreateCheckBox sh, 1
    chkBoxes.Add chk

    Set chk = New MyCheckBox
    chk.CreateCheckBox sh, 2
    chkBoxes.Add chk

End Sub

当然,方法CreateCheckBox必须根据您的需要进行调整(我的方法是在第一列创建复选框)。模块中的全局集合是必需的,否则当子完成并且事件永远不会被触发时,类会自动销毁。如果打开并关闭工作簿,则必须将此代码升级为:

1)在Workbook事件上重新创建类,即打开

2)每次打开工作簿时重新创建CheckBoxes