使用するときにこれをお勧めしますWorksheet_Change
シート名は必要ありません。シートコードモジュールでは、修飾されていない範囲参照はそのシートを参照します。Me
とはいえ、修飾子を使用する方が明確です。別のシートを使用しようとしている場合は、そのシートで範囲参照を修飾します。
イベントを操作しているときはいつでも、セルにデータを書き込んでいる場合はWorksheet_Change
常にイベントを切り替えてください。Off
これは、コードがChangeイベントを再トリガーせず、無限のループに陥らないようにするために必要です。
イベントをオフにするときはいつでも、エラー処理を使用してオンに戻します。そうしないと、エラーが発生した場合、コードは次回実行されません。
これを試して
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Whoa
Application.EnableEvents = False
Me.Range("A1:A8").Formula = "=B1+C1"
Letscontinue:
Application.EnableEvents = True
Exit Sub
Whoa:
MsgBox Err.Description
Resume Letscontinue
End Sub
このイベントで作業するときに知りたいことが他にいくつかあります。
複数のセルが変更されたときにコードが実行されないようにする場合は、小さなチェックを追加します
Private Sub Worksheet_Change(ByVal Target As Range)
'~~> For Excel 2003
If Target.Cells.Count > 1 Then Exit Sub
'
'~~> Rest of code
'
End Sub
The CountLarge
was introduced in Excel 2007 onward because Target.Cells.Count
returns an Long
value which can error out in Excel 2007 becuase of increased total cells count.
Private Sub Worksheet_Change(ByVal Target As Range)
'~~> For Excel 2007
If Target.Cells.CountLarge > 1 Then Exit Sub
'
'~~> Rest of code
'
End Sub
To work with all the cells that were changed use this code
Private Sub Worksheet_Change(ByVal Target As Range)
Dim aCell As Range
For Each aCell In Target.Cells
With aCell
'~~> Do Something
End With
Next
End Sub
To detect change in a particular cell, use Intersect
. For example, if a change happens in Cell A1
, then the below code will fire
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("A1")) Is Nothing Then
MsgBox "Cell A1 was changed"
'~~> Your code here
End If
End Sub
To detect change in a particular set of range, use Intersect
again. For example, if a change happens in range A1:A10
, then the below code will fire
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("A1:A10")) Is Nothing Then
MsgBox "one or more Cells in A1:A10 range was changed"
'~~> Your code here
End If
End Sub