2012-09-22 34 views
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 

我只想在MsgBox中选择并更改r1中的某个单元格,而不是通过运行另一个更改此单元格的代码。如何仅在手动选择目标时运行Workseet_Change事件?

回答

1

试试这个

Module,声明Public变量

Public CodeChangingCells As Boolean 

在你替补,可以改变设置relavent细胞这个变量

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 
+0

这两个解决方案的工作原理。非常感谢。 – Alegro

2

使用标志。

设置为ImDoingTheUpdating=True当你在你的例程中,并在完成时返回False

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

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,然后按回车/回车键。

+0

谢谢,噢,非常有用 – Alegro

相关问题