这些复选框是 Excel 自己的;即不是 ActiveX 的。
编写代码以纯粹根据动态放置的控件的位置来推断关系比命名控件并让每个控件更新正确的控件要复杂得多。即使有数百个;)这里的答案是自动化控件命名过程。
这里的关键因素是对此类复选框的更新必须触发一些代码来处理其余部分的检查/清除。因此,您必须为每个主复选框分配一个宏,该宏将在单击该复选框时运行。或者,您可以将复选框的值链接到一个单元格并使用工作表的 Update 事件来运行一些代码(尽管这是一个不太精细的解决方案)。
如果您想动态地执行此操作(即纯粹在布局上),则在宏中检查每个主复选框的位置和大小,并将其与所有其他复选框的位置和大小进行比较。只有您可以决定哪个布局标准导致哪个子复选框属于哪个主复选框(例如,它必须缩进,还是在它的右侧,并且还要考虑所有其他主复选框的位置 - 它们是在一个下面缩进并不意味着它们不能属于另一个!)
如果您只是为每个主复选框和子复选框指定一个名称,那么宏会变得更加简单。在这种情况下,我会选择使用命名约定:例如将每个主复选框命名为“MasterX”,并让所有子复选框使用以随附主复选框名称开头的派生名称,例如“MasterX_ChildY”。然后,您可以拥有知道哪个复选框属于哪个主复选框的通用代码。从那时起,您只需要从每个主复选框的单击宏中调用如下所示的子:
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
此子复选框只是将所有子复选框设置为与其主复选框相同的状态,因此需要对其进行一些增强以专门执行您想要的操作(这是您只能执行的操作)。