我正在创建一个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;)
有什么建议吗?非常感谢你。
答案 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
...而且效果很好。