0
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,而不是通过运行另一个更改此单元格的代码。

4

3 回答 3

2

使用旗帜。

ImDoingTheUpdating=True在您的例行程序中设置,并在False完成时返回。

这样,您可以放入If ImDoingTheUpdating Then Exit SubWorksheet_Change 事件

于 2012-09-22T19:42:17.413 回答
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在调试器的立即窗口中键入并按回车键。

于 2012-09-22T22:39:30.360 回答
1

试试这个

在 aModule中,声明一个Public变量

Public CodeChangingCells As Boolean

在所有可以更改相关单元格的 Subs 中设置此变量

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
于 2012-09-22T19:44:52.823 回答