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

选择/取消选择EXCEL VBA宏范围中的所有复选框,vba,excel,checkbox,Vba,Excel,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.T

我正在创建一个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
Sub-Select_-all()
将Cbox设置为Dim复选框
变暗Rng As范围
设置Rng=ActiveWorkbook.Sheets(“Sheet4”).范围(“B7,B104”)
对于ActiveSheet.checkbox中的每个Cbox
如果不相交(Cbox.TopLeftCell,Rng)则为空
如果Cbox.name ActiveSheet.checkbox(“复选框104”).name则
Cbox.Value=ActiveSheet.checkbox(“复选框104”).Value
如果结束
如果结束
下一个Cbox
端接头
我补充说

如果不相交(Cbox.TopLeftCell,Rng)则为空

但它不会改变任何东西,当我删除这个部分时,它会选择表中的所有复选框,我只需要范围(“B7:B104”)


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

这对我很有用。但我把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
子链接\u复选框\u到\u单元格()
将cBox设置为Dim复选框
对于Sheet1.1中的每个cBox复选框
如果不相交(cBox.TopLeftCell,Range(“B7:B104”))则为零
如果cBox.Name ActiveSheet.checkbox(“复选框1”).Name则
cBox.Value=ActiveSheet.checkbox(“复选框1”).Value
如果结束
如果结束
下一个cBox
端接头

这对我很有用。但我把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
子链接\u复选框\u到\u单元格()
将cBox设置为Dim复选框
对于Sheet1.1中的每个cBox复选框
如果不相交(cBox.TopLeftCell,Range(“B7:B104”))则为零
如果cBox.Name ActiveSheet.checkbox(“复选框1”).Name则
cBox.Value=ActiveSheet.checkbox(“复选框1”).Value
如果结束
如果结束
下一个cBox
端接头
@JuniorDev

上面的代码不适合您有几个原因。我会试着把它们列出来

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

如果不确定复选框的类型,则可以运行以下代码来查找它们的名称以及它们是什么类型的控件(窗体或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
@朱尼奥德夫

上面的代码不适合您有几个原因。我会试着把它们列出来

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

如果不确定复选框的类型,则可以运行以下代码来查找它们的名称以及它们是什么类型的控件(窗体或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

很抱歉让一篇旧文章死灰复燃,但我讨厌没有解决方案的时候,我知道答案,这是很少见的。谢谢,这对我目前正在做的一个项目很有帮助

如果你和我一样,为了清楚起见,我会更改所有的工作表名称

For Each cBox In Sheet1.CheckBoxes
John Muggins代码中的这一行将您限制为工作表名称“Sheet1”。
我可以把线路改成

For Each cBox In ActiveSheet.CheckBoxes

…而且它工作得很好。

很抱歉恢复了一篇旧帖子,但我讨厌它没有提供解决方案,而且我知道答案,而答案很少。谢谢,这对我目前正在做的一个项目很有帮助

如果你和我一样,为了清楚起见,我会更改所有的工作表名称

For Each cBox In Sheet1.CheckBoxes
John Muggins代码中的这一行将您限制为工作表名称“Sheet1”。
我可以把线路改成

For Each cBox In ActiveSheet.CheckBoxes

…而且它工作得很好。

您为什么将范围定义为
范围(“B7,B104”)
?这意味着它只有两个单元格B7和B104,而不是单元格B7:B104的范围。然后在你的代码下面,你把
范围(“B7:B104”)
的正确定义放在下面,所以换个说法。它们是ActiveX复选框还是表单控件复选框?@tigeravatar我也这么做了,我只是错误地粘贴了代码。@RobinMackenzie表单控件复选框你为什么把范围定义为
范围(“B7,B104”)
?这意味着它只有两个单元格B7和B104,而不是单元格B7:B104的范围。然后在你的代码下面,你把
范围(“B7:B104”)
的正确定义放在下面,所以就换成它。它们是ActiveX复选框还是表单控件复选框?@tigeravatar我也这么做了,我只是错误地粘贴了代码。@RobinMackenzie表单控件复选框谢谢你的回答。但奇怪的是为什么它不起作用。我试过一本新的练习册,它是一样的。我需要添加一些参考资料吗?还是一些配置?谢谢你的回答。但奇怪的是为什么它不起作用。我试过一本新的练习册,它是一样的。我需要添加一些参考资料吗?还是一些配置?