Private Sub Worksheet_Change(ByVal Target As Range)
Dim r1 As Range
Set r1 = Range("A1:B10")
If Intersect(Selection, r1) Is Nothing Then Exit Sub ' how to write this line ?
MsgBox "323"
End Sub
只有当我手动选择并更改r1中的某个单元格而不是通过运行另一个更改此单元格的代码时,我才想要MsgBox。
答案 0 :(得分:2)
使用旗帜。
在日常工作中设置ImDoingTheUpdating=True
,完成后返回False
。
这样,您可以将If ImDoingTheUpdating Then Exit Sub
放入Worksheet_Change事件
答案 1 :(得分:2)
如果要在运行代码时禁用事件,通常的做法是使用Application.EnableEvents = false
因此,根据您的示例代码,第二个子组在更改单元格时不会触发更改事件。
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r1 As Range
Set r1 = Sheet1.Range("A1:B10")
If Intersect(Selection, r1) Is Nothing Then Exit Sub ' how to write this line ?
MsgBox "323"
End Sub
Sub EventsWillFire()
'Worksheet_Change will fire
Sheet1.Range("A1:B10").ClearContents
End Sub
Sub EventsDisabled()
'Worksheet_Change will NOT fire
Application.EnableEvents = False
Sheet1.Range("A1:B10").ClearContents
Application.EnableEvents = True
End Sub
唯一需要注意的是,如果在调试时退出代码或者没有正确处理错误,那么Application.EnableEvents可能处于FALSE状态,并且不会触发任何事件。重新启用它们的一种快捷方法是在调试器的立即窗口中键入Application.EnableEvents = True
,然后单击return / enter。
答案 2 :(得分:1)
试试这个
在Module
中,声明Public
变量
Public CodeChangingCells As Boolean
在所有可以改变相关细胞的子中设置此变量
Sub SubTahtChangesCells()
On Error GoTo EH
CodeChangingCells = True
Sheet1.[A1] = Sheet1.[A1] + 1
CleanUp:
On Error Resume Next
CodeChangingCells = False
Exit Sub
EH:
' Handle errors
GoTo CleanUp
End Sub
在Cnage
事件中测试此变量
使用Target
而不是Selection
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r1 As Range
If Not CodeChangingCells Then
Set r1 = Me.Range("A1:B10")
If Intersect(Target, r1) Is Nothing Then Exit Sub ' how to write this line ?
MsgBox "323"
End If
End Sub