在Excel VBA中有一个复选框勾选/取消勾选多个其他复选框

时间:2014-02-13 09:00:57

标签: excel vba checkbox

我有一张Excel表格,上面有数百个复选框。我想要一些这些复选框(我将其称为“主复选框”)来勾选或取消勾选其他12个复选框。到目前为止,我只能在整个工作表中找到代码来执行此操作(例如,在整个工作表中取消选中复选框),但不能在选定的复选框数组中找到。

理想情况下,宏应该理解以动态方式勾选/取消勾选的框(即通过相对于主复选框所在的位置查找它们),因为我有很多要实现的,并且必须硬编码地址受每个主复选框影响的每个复选框都非常繁琐......

我不确定我的盒子是否为activx,但如果这可以提供帮助,我使用以下命令通过宏实现它们:     ActiveSheet.CheckBoxes.Add

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

这些复选框是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

这个子程序只是将所有子复选框设置为与其主控器相同的状态,因此需要对其进行一些特定的增强,以便具体执行您想要的操作(这是您只能做的事情)。