excel - 我应该更好地修改 .ClearContents 的一些代码吗?

标签 excel vba

我有用于清除“Sheet1”上具有下拉列表的单元格的简单宏。

Sub reset1()

    Range("D20:E21").ClearContents
    Range("D8:E9").ClearContents
    Range("D6:E7").ClearContents

End Sub

Sub reset2()

    Range("D20:E21").ClearContents
    Range("D8:E9").ClearContents
End Sub
然后如果单元格值发生变化,我会在“Sheet1”上调用这些宏
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$D$4" Then
        Call reset1
    End If
    If Target.Address = "$D$6" Then
        Call reset2
    End If
End Sub
此代码写在“Sheet1”上。
通常它可以工作,但有时 reset1() 不起作用。
然后我应该保存并重新打开 excel 或手动运行宏。
我应该更好地修改一些代码吗?

最佳答案

第一个问题是 Range("D20:E21")目前尚不清楚该范围应该在哪个工作表中。始终指定工作表,如 Worksheets("Sheet1").Range("D20:E21") .
第二个问题是,如果您 .ClearContentsWorksheet_Change事件这是一个单元格更改并触发另一个 Worksheet_Change事件等等。所以建议禁用事件Application.EnableEvents = False在更改 Worksheet_Change 中的单元格之前事件。
第三个问题是,如果你测试 Target.Address = "$D$4"然后你复制粘贴一个范围D4包含您的代码,即使您的单元格 D4 也不会运行改变了。因此,您总是需要使用 Intersect .

Option Explicit

Sub Reset1(ByVal ws As Worksheet)
    ws.Range("D20:E21,D8:E9,D6:E7").ClearContents
    ' alternative:
    ' Union(ws.Range("D20:E21"), ws.Range("D8:E9"), ws.Range("D6:E7")).ClearContents
End Sub

Sub Reset2(ByVal ws As Worksheet)
    ws.Range("D20:E21,D8:E9").ClearContents
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
    On Error Goto ENABLE_EVENTS  ' in any case an error happens make sure events are enabeld again
    If Not Intersect(Target, Me.Range("D4")) Is Nothing Then
        Reset1 Me  ' here we tell Reset1 to take `Me` as worksheet. Me refers to the worksheet `Target` is in.
    End If
    
    If Not Intersect(Target, Me.Range("D6")) Is Nothing Then
        Reset2 Me
    End If

ENABLE_EVENTS:
    Application.EnableEvents = True
    If Err.Number Then
        Err.Raise Err.Number
    End If
End Sub

关于excel - 我应该更好地修改 .ClearContents 的一些代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68663518/

相关文章:

vba - 在 Workbook_open 上创建和分配变量,将其传递给 Worksheet_change

string - excel中如何合并折线

excel - 连接字符串,然后使用 ="concatenated string"执行字符串语句

excel - 多项式函数 vba 的 LinEst

vba - Access 2007 中的颜色常量

excel - 索引匹配,excel 资源不足

java - 加密方式(密码保护)已创建的 .xls 文件

vba - VBA 宏运行时关闭 "everything"

sharepoint - 批量复制文件到 SharePoint 站点

excel - 过滤后的行地址