2012-09-22 36 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

相關問題