我有一个非常简单的宏来隐藏单击时复选框所在的行。它有效,但问题是有很多行。
Private Sub CheckBox3_Click()
[3:3].EntireRow.Hidden = CheckBox3.Value
Range("AB3").Value = True
End Sub
我当然可以为我拥有的每个复选框创建一个单独的宏(所有250个),但我希望我能避免使用6页长的宏。
我的问题是:有没有办法将它合并为1?唯一不同的是数字(在例子中为3)。
答案 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