Excel VBA-删除复选框并取消与单元格的链接
我在这里找到了一个宏(),它将在所选范围内创建复选框-这很好-但现在我想做相反的事情,即删除指定范围内的复选框 以下是创建复选框的代码:Excel VBA-删除复选框并取消与单元格的链接,excel,vba,Excel,Vba,我在这里找到了一个宏(),它将在所选范围内创建复选框-这很好-但现在我想做相反的事情,即删除指定范围内的复选框 以下是创建复选框的代码: Sub Insert_chkbx_Link_Cell() Dim rngCel As Range Dim ChkBx As CheckBox For Each rngCel In Selection With rngCel.MergeArea.Cells If .Resize(1, 1).Add
Sub Insert_chkbx_Link_Cell()
Dim rngCel As Range
Dim ChkBx As CheckBox
For Each rngCel In Selection
With rngCel.MergeArea.Cells
If .Resize(1, 1).Address = rngCel.Address Then
Set ChkBx = ActiveSheet.CheckBoxes.Add(.Left, .Top, .Width, .Height)
With ChkBx
.Value = xlOff
.LinkedCell = rngCel.MergeArea.Cells.Address
With .Border
End With
End With
End If
End With
Next rngCel
End Sub
下面是一个将“取消链接/取消分配”单元格复选框的子项:
Sub Un_Assign()
For Each sht In ActiveWorkbook.Sheets
For Each CheckBox In sht.CheckBoxes
CheckBox.OnAction = ""
Next CheckBox
Next sht
End Sub
问题是,它不会在指定的范围内执行此操作,而是会在每个工作表中执行此操作
因此,我将创建复选框的宏更改为删除复选框的宏:
Sub Remove_chkbx_Unlink_Cell()
Dim rngCel As Range
Dim ChkBx As CheckBox
For Each rngCel In Selection
With rngCel.MergeArea.Cells
If .Resize(1, 1).Address = rngCel.Address Then
ActiveSheet.CheckBoxes.Delete
End If
End With
Next rngCel
End Sub
同样,这非常有效,但它会删除工作表上的每个复选框
因此,我在if
语句中为每个循环添加了,并尝试指定一个范围:
Sub Remove_chkbx_Unlink_Cell()
Dim rngCel As Range
Dim ChkBx As CheckBox
For Each rngCel In Selection
With rngCel.MergeArea.Cells
If .Resize(1, 1).Address = rngCel.Address Then
For Each ChkBx In rngCel
CheckBox.OnAction = ""
Next ChkBx
rngCel.CheckBoxes.Delete
End If
End With
Next rngCel
End Sub
问题在于,对于rngCel中的每个ChkBx,我在行中得到了和错误:
类型不匹配
编辑
下图中有6个复选框,前三个选中,后三个未选中。是否有办法通过选择未选中框链接到的单元格来删除未选中框
下面,我选择了空复选框中的单元格,并且与我“创建”复选框的方式大致相同,我希望删除它们:即,选择一个单元格区域并删除该区域中的复选框
要删除特定范围内的复选框,您只需遍历工作表中的所有复选框,并在它们的.TopLeftCell
与目标范围相交()时将其删除即可
Option Explicit
Public Sub TestDeleteCheckBoxes()
'delete all CheckBoxes in A1:A10 in Sheet1
DeleteCheckBoxes ThisWorkbook.Worksheets("Sheet1").Range("A1:A10")
End Sub
Public Sub DeleteCheckBoxes(Target As Range)
Dim Cbx As CheckBox
For Each Cbx In Target.Parent.CheckBoxes 'loop through all CheckBoxes on the worksheet
If Not Intersect(Cbx.TopLeftCell, Target) Is Nothing Then
Cbx.Delete 'delete it if it intersects with the target range
End If
Next Cbx
End Sub
注意:我将其包装到一个过程中,以便您可以在任何目标范围内重复使用代码。要删除特定范围内的复选框,您只需在工作表中的所有复选框中循环,并在它们的.TopLeftCell
与您的目标范围相交()时删除它们
Option Explicit
Public Sub TestDeleteCheckBoxes()
'delete all CheckBoxes in A1:A10 in Sheet1
DeleteCheckBoxes ThisWorkbook.Worksheets("Sheet1").Range("A1:A10")
End Sub
Public Sub DeleteCheckBoxes(Target As Range)
Dim Cbx As CheckBox
For Each Cbx In Target.Parent.CheckBoxes 'loop through all CheckBoxes on the worksheet
If Not Intersect(Cbx.TopLeftCell, Target) Is Nothing Then
Cbx.Delete 'delete it if it intersects with the target range
End If
Next Cbx
End Sub
注意:我将此代码包装到一个过程中,以便您可以在任何目标范围内重复使用该代码。感谢您的快速回复。我测试了你的代码,它工作得很好,我唯一的问题是,我需要给一个预定义的范围选择,但是,复选框将不总是在同一范围内。。。是否有一种方法可以通过选择有复选框的单元格,然后删除链接到这些单元格的复选框来实现?与使用“选择”创建复选框的方式相同。“选择有复选框的单元格,然后删除链接到这些单元格的复选框?”这不会删除工作表上的所有复选框吗?请澄清你的确切意思或者你的意思是删除所选范围内的所有复选框?对不起,我在问题的末尾为我的帖子提供了一个屏幕截图-基本上,这是你现在说的“或者你的意思是删除所选范围内的所有复选框”好吧,你可以使用deleteCheckbox Selection
。哈哈,哦,我不知道:/。。非常感谢:)谢谢你的快速回复。我测试了你的代码,它工作得很好,我唯一的问题是,我需要给一个预定义的范围选择,但是,复选框将不总是在同一范围内。。。是否有一种方法可以通过选择有复选框的单元格,然后删除链接到这些单元格的复选框来实现?与使用“选择”创建复选框的方式相同。“选择有复选框的单元格,然后删除链接到这些单元格的复选框?”这不会删除工作表上的所有复选框吗?请澄清你的确切意思或者你的意思是删除所选范围内的所有复选框?对不起,我在问题的末尾为我的帖子提供了一个屏幕截图-基本上,这是你现在说的“或者你的意思是删除所选范围内的所有复选框”好吧,你可以使用deleteCheckbox Selection
。哈哈,哦,我不知道:/。。非常感谢:)
Option Explicit
Public Sub TestDeleteCheckBoxes()
'delete all CheckBoxes in A1:A10 in Sheet1
DeleteCheckBoxes ThisWorkbook.Worksheets("Sheet1").Range("A1:A10")
End Sub
Public Sub DeleteCheckBoxes(Target As Range)
Dim Cbx As CheckBox
For Each Cbx In Target.Parent.CheckBoxes 'loop through all CheckBoxes on the worksheet
If Not Intersect(Cbx.TopLeftCell, Target) Is Nothing Then
Cbx.Delete 'delete it if it intersects with the target range
End If
Next Cbx
End Sub