category name  »  page title date

Worksheet_Change イベント

ワークシートの Worksheet_Change イベントは便利なイベントで、よく使うと思います。
ワークシートのどこかのセルが変更された場合、そのセルの情報 target を抱えて起動されます。これを使って、どのセルが変更されたのかを知ることができ、それに応じて必要な関数を呼ぶことができます。
この target は実はセルではなく Range なのでセル範囲です。知っておく必要のあるのは、次の2点。

(1) そもそも、変更とは何か。

セルの値が変更されるとこのイベントが発生するというのはわかりやすいのですが、ほかにも、セルや行・列の挿入削除、コピー&ペーストをはじめ、「変更された」と言える動きがたくさんありそうです。
マクロによってセルの値が変更された場合に、このイベントが発生します。
ワークシートの式によって値が変更した場合は、セルにはいっている式そのものが変更されたわけではないので、このイベントは発生しません。
セルの書式やフォントなどが変更された場合にも、このイベントは発生しません。


(2) target はどこを指しているか。

挿入や削除を行った場合に、target はどの範囲を指しているのか。結論的には、挿入された新しい範囲、削除されていなくなった範囲。わかりにくいですが、挿入したり削除したりする前の選択範囲が target に入っています。変更対象とした範囲が入っているように錯覚しがちですが、そうではないことに注意しましょう。


以上のことを確認するために、ワークシートにこんなマクロをいれてみました。
このワークシートがアクティブになった段階で、10×10のセルに文字をいれておきます(ここでは、変化がわかりやすいように、そのセルのアドレスをいれました)。
そこで任意のセルまたはセル範囲の値を変更したり、挿入削除を行ったり、あるいはほかの変更を加えたりしてみると、Worksheet_Change イベントが発生した場合にそのコメントと target の内容(アドレス)がイミディエイト・ウィンドウに書き出されます。

ワークシート           Sheet1

Private keepSilent As Boolean
Private Sub Worksheet_Activate()
Dim cell, row, column
      keepSilent = True
      Cells.Clear
      For row = 1 To 10
            For column = 1 To 10
                  Set cell = Cells(row, column)
                  cell.Value = cell.Address
            Next
      Next
      keepSilent = False
End Sub
Private Sub Worksheet_Change(ByVal target As Range)
Dim caption
      If keepSilent Then Exit Sub
      caption = InputBox("操作")
      With target
            Debug.Print caption & " " & target.Address
      End With
End Sub



結果は、図のごとし。
Change イベントが発生しなかった場合には、何も出力されません。
いろいろと試してみると、イベントとの相互理解が深まります。