Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA-删除复选框并取消与单元格的链接_Excel_Vba - Fatal编程技术网

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