Worksheet_Changeイベント

セルの値が変わったときにマクロを動かしたい場合があります。セルの値が変わったことを検知するには、セルがある対象のシートにWorksheet_Changeという名前のプロシージャを作っておく必要があります。

Worksheet_Changeプロシージャのようにイベント関連のプロシージャは基本的にVBA画面の操作で作成します。手順は以下になります。

  1. VBA画面で対象シートのコードを開きます。
  2. Worksheetオブジェクトを選択します。このときWorksheet_SelectionChangeプロシージャが作成されますが、これは使いませんので後で削除します。
  3. Worksheet_Changeイベントを選択します。
  4. これでWorksheet_Changeが作成されます。先に作成されていたWorksheet_SelectionChangeプロシージャは不要なため削除します。

あとは、Worksheet_Changeプロシージャの中で、セルの値が変わった際に行いたい処理を書いていくことになります。必要であれば引数のセルの値が変わった対象であるRangeオブジェクトを使います。

構文

Private Sub Worksheet_Change(ByVal Target As Range)

Target 直前に値が変わったセルのRangeオブジェクトが設定されます。

対象セルが結合セルや複数セルの場合はそのセル範囲のRangeオブジェクトが設定されます。

値が変わったセルを特定する

直前に値が変わったセルを特定するには、Worksheet_Changeプロシージャの引数のRangeオブジェクトを利用します。

Rangeオブジェクトのため、セル操作で利用するメソッドやプロパティを利用できます。

例えば対象のセルの座標を取得するには以下のようにAddressプロパティを利用します。

また、背景色を黄色にしたいのであれば、以下のようにInterior.Colorプロパティで設定することで背景色が設定されます。

このように引数のRangeオブジェクトを使ってセル操作を行うことが可能です。

VBAの処理で値が変わった場合

手でセルの値を入力したり変更した場合は上のような対応でOKですが、VBAの処理でセルの値が変わった場合はどうなるでしょうか。

結果は、手入力の場合は同様に、VBAでセルの値を変更した場合もWorksheet_Changeプロシージャが呼び出されます。

以下のように複数セルに対して同時に値を変更したとします。

そして、Worksheet_Changeプロシージャが呼び出されます。

手でセルの値を変えた場合と同様に、背景色を黄色に設定する処理も各セルに対して行われます。

Worksheet_Changeプロシージャが動作しない場合

Worksheet_Changeプロシージャが動作していないように見えることがあります。

これはほとんどの場合が、セルの値が変わったシートと、Worksheet_Changeプロシージャを書いているシートが異なることが原因です。

Sheet1のコードにWorksheet_Changeプロシージャを書いている場合に、Sheet2のセルの値を変更しても、Sheet1のWorksheet_Changeプロシージャは呼び出されません。

複数のシートを持っているブックを操作する場合には勘違いしやすいので注意してください。