如果手动选择目标,如何运行Workseet_Change事件?

时间:2012-09-22 19:01:08

标签: excel vba

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。

3 个答案:

答案 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