只有手动select目标时如何运行Workseet_Change事件?

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 

我只想要MsgBox,如果我手动select和更改r1内的一些单元格,而不是通过运行另一个代码,更改此单元格。

尝试这个

Module ,声明一个Publicvariables

 Public CodeChangingCells As Boolean 

在所有你可以改变relavent细胞设置这个variables

 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事件中testing这个variables
使用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 

使用一个标志。

设置ImDoingTheUpdating=True当你在你的日常工作,并返回到False时完成。

这样,你可以把If ImDoingTheUpdating Then Exit Sub到Worksheet_Change事件

如果要在运行代码时禁用事件,通常的做法是使用Application.EnableEvents = false

所以根据你的示例代码,第二个子组在更改单元格时不会触发change事件。

 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 

唯一要注意的是,如果在debugging时退出代码或者不正确处理错误,则Application.EnableEvents可能处于FALSE状态,并且不会触发事件。 快速重新启用它们的方法是在debugging器的“立即”窗口中键入Application.EnableEvents = True ,然后按回车键。