2017-10-09 126 views
1

我有一个非常简单的宏来隐藏点击时复选框所在的行。它的工作原理,但问题是有很多行。VBA excel控制一个宏的多个复选框

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

End Sub 

当然我可以做一个单独的宏,为每一个复选框,我有(其中所有250),但我希望我能够避免macropage是6页长。

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

+0

不知道是否有类是一个很大的区别,但它们是ActiveX复选框 – perbrethil

回答

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)重新在工作簿事件即开

2)重新创建的CheckBox每次打开工作簿