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