清除一个单元格时清除excel表格中的单元格

清除一个单元格时清除excel表格中的单元格,excel,vba,macos,Excel,Vba,Macos,我有一张从A12到AO29的桌子。表格标题位于第13行 我正在处理一个宏,该宏在更改或删除列B中的单元格时删除列D、E和I中的数据。下面的代码工作正常,只是它没有删除数据列D。列D有一个数据验证列表 当您检查b12-b29范围时,您没有统一您的范围,因此清除内容的调用只会影响您设置的最后一个范围,即i列 你也可以通过用这样的一行替换它来大幅压缩它 If Not Intersect(Target, Range("b12", "b29")) Is Nothing Then Set rngDB

我有一张从A12到AO29的桌子。表格标题位于第13行

我正在处理一个宏,该宏在更改或删除列B中的单元格时删除列D、E和I中的数据。下面的代码工作正常,只是它没有删除数据列D。列D有一个数据验证列表


当您检查b12-b29范围时,您没有统一您的范围,因此清除内容的调用只会影响您设置的最后一个范围,即i列

你也可以通过用这样的一行替换它来大幅压缩它

If Not Intersect(Target, Range("b12", "b29")) Is Nothing Then
    Set rngDB = Union(Range("d" & Target.Row), Range("e" & Target.Row), Range("i" & Target.Row))
    rngDB.ClearContents
End If

这将更容易管理:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim c As Range

    If Target.Count > 1 Then Exit Sub

    If Not Intersect(Target, _
           Me.Range("A12:B29,D12:D29,E12:E29")) Is Nothing Then

        On Error GoTo haveError
        Application.EnableEvents = False

        For Each c in Target.EntireRow.Range("B1,D1,E1,I1").Cells
            If c.Column > Target.Column Then c.ClearContents
        Next c

        Application.EnableEvents = True
    End If

    Exit Sub

haveError:
    Application.EnableEvents = True
End Sub

注意:在EntireRow上下文中使用范围时,范围是相对于单行的。

感谢ur公式。如果我要使用我的公式,我如何去联合我的范围?如果你看蒂姆的答案,你甚至不需要联合数组。他的代码要简洁得多,应该满足您的需求。事实上,我提供的代码只是更大代码的一部分。我想做的是:当A被清除/更改时,清除B、D、E&I。当B被清除/更改时,清除D、E&I。当E被清除/更改时,清除I。当然,这都是相对于清除的行。然后,我必须为下一个表编写代码,该表随不同的列进行更改,以清除。再次,您不需要联合数组,您只需使用@Tim的answer Target.EntireRow.RangeD1、E1、I1.ClearContents中的行即可。您只需根据具体情况更改列字母。上面的方法适用于b列,适用于d列,它只是Target.EntireRow.Range1,I1.ClearContentsI使用了他的代码。但它没有起到作用。也许我把它用错误的方式浓缩成了我的其他代码。嗨,蒂姆,谢谢你的建议。我已经实现了你的代码。我必须把它放在同一张纸上其他数据的代码中。看起来我这样做的时候把你的代码塞满了。你能检查一下我在问题中输入的新代码吗?也许你可以找出错误并指导我修复它。我现在刚刚粘贴了它。请参阅上面的更新-这将清除同一行和更改单元格右侧的B、D、E、I中的任何单元格。谢谢。
If Not Intersect(Target, Range("b12", "b29")) Is Nothing Then
    Set rngDB = Union(Range("d" & Target.Row), Range("e" & Target.Row), Range("i" & Target.Row))
    rngDB.ClearContents
End If
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim c As Range

    If Target.Count > 1 Then Exit Sub

    If Not Intersect(Target, _
           Me.Range("A12:B29,D12:D29,E12:E29")) Is Nothing Then

        On Error GoTo haveError
        Application.EnableEvents = False

        For Each c in Target.EntireRow.Range("B1,D1,E1,I1").Cells
            If c.Column > Target.Column Then c.ClearContents
        Next c

        Application.EnableEvents = True
    End If

    Exit Sub

haveError:
    Application.EnableEvents = True
End Sub