微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 VBA 根据动态下拉列表的更新清除内容

如何解决使用 VBA 根据动态下拉列表的更新清除内容

我正在尝试根据使用 VBA 对另一个单元格的更新来清除单元格的内容

列 E 到 H 都是动态下拉列表。我有以下代码

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target,Range("D2")) Is nothing Then
        Range("E2:H2").ClearContents
    End If
End Sub

这适用于第 2 行,但我如何使其成为一个范围,以便如果我更改 D3,它将清除所有行的 E3:H3 等。另外,我能不能做到,如果我在 D 到 H 中更改任何内容,它会清除整行?

谢谢!

解决方法

假设您不想清除标题行

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Row = 1 then exit sub

    ' This will clear the row if something is changed in Column D:
    If Not Intersect(Target,Range("D:D")) Is Nothing Then
        Range(Cells(Target.Row,"E"),Cells(Target.Row,"H")).ClearContents
    End If
End Sub

如果你想清除整个行,你可以使用

Target.EntireRow.ClearContents

然而,这会导致两个问题:
您还将清除刚刚输入的信息(因为它是行的一部分)。您可以通过保存数据来防止这种情况:

Dim backup As Variant
backup = Target.value
Target.EntireRow.ClearContents
Target.value = backup

第二个问题是,使用 VBA 在单元格中写入内容将再次触发 Change-Trigger(依此类推,最终导致 Stack Overflow 运行时错误)。为避免这种情况,您需要在触发代码运行时禁用事件 - 最后一定不要忘记启用它们。

Private Sub Worksheet_Change(ByVal Target As Range)
    On Error Goto Change_Exit  ' To ensure that events are reactivated in any case
    Application.EnableEvents = False
    (do your stuff here)

Change_Exit: 
    Application.EnableEvents = True
End Sub

更新:要仅清除右侧的字段,请使用

If Not Intersect(Target,Range("D:G")) Is Nothing Then
    Range(Target.Offset(0,1),"H")).ClearContents
End If
,

也许通过使用目标的行并将清晰的内容范围与它连接起来,像这样

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target,Range("D" & Target.Row)) Is Nothing Then
        Range("E" & Target.Row & ":H" & Target.Row).ClearContents
    End If
End Sub

如果从您的评论中询问,一个非常快速的方法:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target,Range("D" & Target.Row)) Is Nothing Then
        Range("E" & Target.Row & ":H" & Target.Row).ClearContents
        
        ElseIf Not Intersect(Target,Range("E" & Target.Row)) Is Nothing Then
            Range("F" & Target.Row & ":H" & Target.Row).ClearContents
            
            ElseIf Not Intersect(Target,Range("F" & Target.Row)) Is Nothing Then
            Range("G" & Target.Row & ":H" & Target.Row).ClearContents
            
            End If
       End If
    End If
End Sub

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?