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内のセルを手動で選択して変更する場合のみです。

4

3 に答える 3

2

フラグを使用します。

ImDoingTheUpdating=Trueルーティンの途中で設定しFalse、終了したら元に戻します。

If ImDoingTheUpdating Then Exit Subそうすれば、 Worksheet_Change イベントに入れることができます

于 2012-09-22T19:42:17.413 に答える
2

コードの実行時にイベントを無効にしたい場合は、通常の方法で使用しますApplication.EnableEvents = false

サンプルコードに基づいて、2番目のサブはセルを変更するときに変更イベントを発生させません。

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 キーを押すことです。

于 2012-09-22T22:39:30.360 に答える
1

これを試して

で、変数Moduleを宣言します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イベントでこの変数をテストし
ますTargetSelection

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 に答える