选择/取消选择范围EXCEL VBA宏中的所有CheckBox

时间:2017-05-16 14:00:33

标签: excel vba excel-vba checkbox

我正在创建一个VBA宏来选择工作表中的所有复选框,它工作正常但现在我想调整我的代码来选择和取消选择特定范围内的复选框。

这是我的代码。

Sub Select_all()

Dim Cbox As CheckBox
Dim Rng As Range

Set Rng = ActiveWorkbook.Sheets("Sheet4").Range("B7, B104")

For Each Cbox In ActiveSheet.CheckBoxes

If Not Intersect(Cbox.TopLeftCell, Rng) Is Nothing Then
  If Cbox.name <> ActiveSheet.CheckBoxes("Check Box 104").name Then
    Cbox.Value = ActiveSheet.CheckBoxes("Check Box 104").Value
  End If
End If

Next Cbox

End Sub

我添加了

  

如果不相交(Cbox.TopLeftCell,Rng)什么都不是

但它没有改变任何东西,当我删除这部分然后它选择了表格中的所有复选框,我只需要范围(&#34; B7:B104&#34;)

有什么建议吗?非常感谢你。

3 个答案:

答案 0 :(得分:1)

这对我有用。但我把cb#改为“1”,因为我的测试表上没有104。范围B7:B104中的任何cb都将更改为cb1的值,您可以在脚本中将其更改为cb104。

Sub Link_Checkboxes_To_Cells()

    Dim cBox As CheckBox

        For Each cBox In Sheet1.CheckBoxes
            If Not Intersect(cBox.TopLeftCell, Range("B7:B104")) Is Nothing Then
                If cBox.Name <> ActiveSheet.CheckBoxes("Check Box 1").Name Then
                    cBox.Value = ActiveSheet.CheckBoxes("Check Box 1").Value
                End If
            End If
        Next cBox

    End Sub

答案 1 :(得分:1)

@JuniorDev

上述代码对您不起作用的原因有几个。我会尝试列出它们。

以上代码适用于“表单控件”复选框 - 非ActiveX类型复选框。您需要一个不同的ActiveX复选框代码。或者您可能没有名为“复选框1”的表单复选框。但我认为这会给你一个错误。或者您的其他复选框可能不在范围内(“B7:B104”)。您可以尝试将其更改为范围(“A1:Z10000”)以确保您的复选框在范围内。

如果您不确定具有哪种类型的复选框,则可以运行以下代码来查找它们的名称以及它们的控件类型,form或activex。它将在VB编辑器的即时窗口中打印信息。

Sub CheckboxLoop()
'PARTIAL SOURCE: www.TheSpreadsheetGuru.com/the-code-vault
Dim cb As Shape

'Loop through Form Checkboxes
  For Each cb In ActiveSheet.Shapes
    If cb.Type = msoFormControl Then
      If cb.FormControlType = xlCheckBox Then
            Debug.Print "Form Control: " & cb.Name
      End If
    End If
  Next cb

'Loop through ActiveX Checkboxes
Dim ChkBx As OLEObject
For Each ChkBx In ActiveSheet.OLEObjects
  If TypeName(ChkBx.Object) = "CheckBox" Then
        Debug.Print "ActiveX Control: " & ChkBx.Name
  End If
Next ChkBx
End Sub

答案 2 :(得分:0)

很抱歉要复活一个旧帖子,但是在没有提供解决方案且我知道答案的情况下,我很少讨厌它。谢谢,这对我目前正在从事的项目有帮助。

如果您像我一样,为了清楚起见,我会更改所有工作表名称。

For Each cBox In Sheet1.CheckBoxes

John Muggins代码中的这一行将您限制为工作表名称“ Sheet1”。
我能够将行更改为...

For Each cBox In ActiveSheet.CheckBoxes

...而且效果很好。