Worksheet_Changeイベントとは?
Excelのセルの値が変わったときにマクロを動かしたい場合があります。そんなときに便利なのがWorksheet_Changeイベントです。
この記事ではイベントプロシージャの作成手順から、実際の使用例、注意点まで解説します。
Worksheet_Changeイベントの作成手順
セルの値が変わったことを検知するには、セルがある対象のシートにWorksheet_Changeという名前のプロシージャを作っておく必要があります。
Worksheet_Changeプロシージャのようにイベント関連のプロシージャは基本的にVBA画面の操作で作成します。手順は以下になります。
- VBA画面で対象シートのコードを開きます。
- Worksheetオブジェクトを選択します。このときWorksheet_SelectionChangeプロシージャが作成されますが、これは使いませんので後で削除します。
- Worksheet_Changeイベントを選択します。
- これでWorksheet_Changeが作成されます。先に作成されていたWorksheet_SelectionChangeプロシージャは不要なため削除します。
あとは、Worksheet_Changeプロシージャの中で、セルの値が変わった際に行いたい処理を書いていくことになります。必要であれば引数のセルの値が変わった対象であるRangeオブジェクトを使います。
構文と引数の使い方
Private Sub Worksheet_Change(ByVal Target As Range)
Target | 直前に値が変わったセルのRangeオブジェクトが設定されます。
対象セルが結合セルや複数セルの場合はそのセル範囲のRangeオブジェクトが設定されます。 |
値が変わったセルを特定する方法
直前に値が変わったセルを特定するには、Worksheet_Changeプロシージャの引数のRangeオブジェクトを利用します。
Rangeオブジェクトのため、セル操作で利用するメソッドやプロパティを利用できます。
例:変更されたセルの座標を表示
1 2 3 4 |
Private Sub Worksheet_Change(ByVal Target As Range) '// 対象セルの座標を表示 Debug.Print Target.Address(False, False) End Sub |
例:変更されたセルの背景色を黄色にする
1 2 3 4 5 6 7 |
Private Sub Worksheet_Change(ByVal Target As Range) '// 対象セルの座標を表示 Debug.Print Target.Address(False, False) '// 対象セルの背景色を黄色に設定 Target.Interior.Color = vbYellow End Sub |
このように引数のRangeオブジェクトを使ってセル操作を行うことが可能です。
VBAの処理で値が変わった場合の挙動
手でセルの値を入力したり変更した場合は上のような対応でOKですが、VBAの処理でセルの値が変わった場合はどうなるでしょうか。
結果は、手入力の場合は同様に、VBAでセルの値を変更した場合もWorksheet_Changeプロシージャが呼び出されます。
以下のように複数セルに対して同時に値を変更したとします。
1 2 3 |
Sub aaaa() Range("A1:B3,A5,C6").Value = "222" End Sub |
そして、Worksheet_Changeプロシージャが呼び出されます。
1 2 3 4 5 6 7 |
Private Sub Worksheet_Change(ByVal Target As Range) '// 対象セルの座標を表示 Debug.Print Target.Address(False, False) '// 対象セルの背景色を黄色に設定 Target.Interior.Color = vbYellow End Sub |
手でセルの値を変えた場合と同様に、背景色を黄色に設定する処理も各セルに対して行われます。
Worksheet_Changeプロシージャが動作しない原因と対策
Worksheet_Changeプロシージャが動作していないように見えることがあります。
これはほとんどの場合が、セルの値が変わったシートと、Worksheet_Changeプロシージャを書いているシートが異なることが原因です。
例えば、
- Sheet1のコードにWorksheet_Changeプロシージャを書いている
- でも実際に変更しているのはSheet2のセル
この場合、Sheet2の変更はSheet1のWorksheet_Changeでは検知できません。
複数のシートを持っているブックを操作する場合は勘違いしやすいので、どのシートのコードにイベントを記述しているかを必ず確認してください。
まとめ
- Worksheet_Change イベントは「セルの値が変わったタイミング」を検知するためのイベントです。
- VBAのコードで値を変えた場合も、このイベントは呼ばれます。
- 引数 Target を使ってどのセルが変わったかを判別し、セルの背景色変更などの操作が可能です。
- 複数シートのブックでは、イベントを書くシートと値を変更するシートが異なるとイベントは動作しません。
“VBAでセルの値が変更時に処理を行う(Worksheet_Change)” への1件のフィードバック