我有用于清除“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")
.
第二个问题是,如果您 .ClearContents
在 Worksheet_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/