2014-02-13 126 views
0

我有一个带有数百个复选框的Excel工作表。我希望其中一些复选框(我将称之为“主复选框”)勾选或取消选中其他12个复选框。到目前为止,我只能在整个工作表中找到代码(例如,通过整个工作表中的不选复选框),而不是选中的复选框数组中。有一个复选框勾选/取消选择Excel中的多个其他复选框VBA

理想情况下,宏应理解动态方式勾选/取消勾选的方框(即通过相对于主复选框的位置查找它们),因为我有许多要实现的地址,并且必须对地址进行硬编码受每个主复选框影响的每个复选框将是非常单调乏味的...

我不确定我的盒子是不是激活,但如果可以帮助,我通过使用以下命令通过宏执行它们: ActiveSheet。 CheckBoxes.Add

感谢您的帮助!

回答

0

这些复选框是Excel自己的;即不是ActiveX的。

使代码纯粹根据动态放置的控件的位置来扣除关系比命名控件要复杂得多,并且让每个控件更新正确的控件。即使有数百个;)这里的答案是自动化控制命名过程。

这里的关键因素是这种复选框的更新必须触发一些代码来处理其余的检查/清除。因此,您必须为每个主复选框分配一个宏,该复选框将在该复选框被点击时运行。或者,您也可以将复选框的值链接到单元格,并使用工作表的Update事件来运行一些代码(尽管这是一个不太精细的解决方案)。

如果您想要动态地(即纯粹布局布局),那么在宏中,检查每个主复选框的位置和大小,并将其与所有其他复选框的位置和大小进行比较。只有您可以决定哪些布局标准会导致哪个子复选框属于哪个主复选框(例如,它必须缩进或位于其右侧,并且还要考虑所有其他主复选框的位置 - 它们是在一个下面缩进并不意味着它们不能属于另一个!)

如果您只是给每个主复选框分配一个名称,那么宏变得更简单了。在这种情况下,我会选择使用命名约定:例如将每个主复选框命名为“MasterX”,并让所有复选框使用派生名称,该名称以随附的主复选框名称开头,例如“MasterX_ChildY”。然后你可以有通用的代码,知道哪个复选框属于哪个主复选框。从那时起,你只需要调用就像从每个主复选框的Click宏以下子:

Sub UpdateChildCheckboxes() 
    ' Look which master checkbox is clicked 
    Dim masterCheckboxName As String 
    masterCheckboxName = Application.Caller 
    Dim masterCheckbox As CheckBox 
    Set masterCheckbox = ActiveSheet.CheckBoxes.Item(masterCheckboxName) 

    ' And update all belonging child checkboxes 
    Dim nextCheckbox As CheckBox 
    For Each nextCheckbox In ActiveSheet.CheckBoxes 
    ' Is this a child of this master? 
    If InStr(nextCheckbox.Name, masterCheckboxName & "_") = 1 Then 
     ' Yes; update it 
     nextCheckbox.Value = masterCheckbox.Value 
    End If 
    Next 
End Sub 

此子只是将所有的孩子复选框以相同的状态他们的主人,所以需要加强一点专门做你想做的事(这是你只能做的事)。

相关问题