1. Worksheet_Changeイベントとは
Worksheet_Changeイベントとは、
シート上のセルの値が変更されたときに自動で実行されるイベントです。
ユーザーの手入力だけでなく、
- コピー&貼り付け
- 数式の上書き
- 値のクリア
など、値が変わる操作全般が対象になります。
このイベントは、
対象シートのコード画面に次のように記述します。
Private Sub Worksheet_Change(ByVal Target As Range)
'セル変更時の処理
End Sub
ここで重要なのが、
Target引数の存在です。
2. Targetとは何か(最重要ポイント)
Targetとは、
変更が発生したセル範囲を表すRangeオブジェクトです。
つまり、
- どのセルが
- どの範囲で
- 変更されたのか
という情報が、すべてTargetに入っています。
注意点として、
Targetは「必ず1セル」とは限りません。
- 複数セル同時変更
- 範囲貼り付け
の場合、
Targetは 複数セルのRange になります。
3. 特定のセル・範囲だけを対象にする方法
Worksheet_Changeでは、
Targetの絞り込み が非常に重要です。
何も制御しないと、
シート内のどの変更にも反応してしまいます。
単一セルを判定する例
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" Then
'A1が変更されたときの処理
End If
End Sub
特定範囲かどうかを判定する例
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A1:A10")) Is Nothing Then
'A1~A10が変更されたときの処理
End If
End Sub
実務では、
Intersectを使った範囲判定 が最も一般的です。
4. 複数セル変更時の注意点
コピー&貼り付けなどでは、
Targetが複数セルになることがあります。
この場合、
- 想定外の処理が動く
- 処理が何度も実行される
といった問題が起こりがちです。
そのため、
次のような制御を入れることがあります。
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.CountLarge > 1 Then Exit Sub
'単一セル変更時のみ処理
End Sub
これにより、
1セル入力時のみ処理を実行 できます。
5. 無限ループを防ぐための注意点
Worksheet_Changeで最も多いトラブルが、
無限ループ です。
イベント内でセルの値を変更すると、
再びWorksheet_Changeが発生します。
これを防ぐために、
次のような制御が必要になります。
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
'セル変更処理
Application.EnableEvents = True
End Sub
EnableEventsを使うことで、
イベントの一時停止 が可能になります。
ただし、
Trueに戻し忘れるとイベントが一切動かなくなるため、
慎重に扱う必要があります。
また、
途中でエラーになってしまった場合にもTrueに戻らないため、
エラーが起こった際の動きも考慮すると安心です。
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo ExitHandler
Application.EnableEvents = False
'処理
ExitHandler:
Application.EnableEvents = True
End Sub
6. Worksheet_Changeが向いている実務例
Worksheet_Changeは、
入力完了後のチェックや制御 に非常に向いています。
代表的な用途は次のとおりです。
- 入力必須チェック
- 値の自動補正
- 入力形式の統一
- 他セルへの連動反映
「入力された瞬間に何かをしたい」
という場面では、
まずWorksheet_Changeを検討するとよいでしょう。
7. Worksheet_Changeを使いこなすために
Worksheet_Changeを安全に使うためには、
- Targetの範囲を必ず限定する
- 複数セル変更を想定する
- 無限ループ対策を入れる
という3点が重要です。
コメント