Excel VBA:特定のセルの値が変更されたとき(更新後処理イベント)だけVBAのプログラムを実行する方法

Excel VBA:特定のセルの値が変更されたとき(更新後処理イベント)だけVBAのプログラムを実行する方法

セルに設定できる標準の機能では足りなかったり、やりたい処理と微妙に違っていてオリジナルの処理を実行させたいときに使える。

以下VBAのサンプルプログラムと説明。

セルの内容が変更された時に呼び出されるイベントプロシージャ”Worksheet_Change”イベント

基本的にセルに変更があった際にプログラムを実行したい場合は、対象のワークシートの”Worksheet_Change”イベントに記述する。

“Worksheet_Change”イベントは、引数として”Target”というRangeオブジェクトを持っていて、”Target”引数を使って現在のセルの番地などを調べることができる。

“Worksheet_Change”イベントの記述は、[ツール]メニューの[マクロ]から[Visual Basic Editor]を選択して、[Visual Basic Editor]の画面左側のウィンドウから対象となるシートをダブルクリックする。

対象となるシートのモジュールシートが表示されるので上部コンボボックスから”WorkSheet”を選択し、右のコンボボックスから”Change”を選択する。

コンボボックスから”Change”を選択するとモジュールシートに以下のコードが表示される。


以降にサンプルプログラムを紹介する。

例1:Sheet1のセルのA1からC30までの範囲のセルに値に変更があった場合にメッセージボックス(MsgBox)を表示する。

例2:A1からA10、C1からC10など、対象のセル範囲が離れている場合

上記のサンプルプログラムでは、条件が2つに分かれており、それぞれに同じ処理を記述するのは面倒なので、実際に実行したい処理を別のプロシージャに記述して、それを呼び出すことによってその手間を省くようにしている。

全部のシートの決まったセル範囲に設定したい場合は、WorkBookの”Workbook_SheetChange”イベントに記述すればよい。

“Workbook_SheetChange”も同じように”Target”引数を持っているので同じように条件設定すれば問題ない。

ちなみに”Workbook_SheetChange”イベントは、”Sh”引数を持っていて、これは選択されているSheetを表すオブジェクト変数になっている。

例えば、Sheet1とSheet3の同じセル範囲だけで値の変更時に処理をしたい場合は、まず”Sh”引数で選択されているシートを調べる条件を設定すればよい。

例3:Sheet1とSheet3のA1からC10までのセルの値に変更があったときにプログラムを実行

こんなことをしなくてもExcelの標準機能でできることがほとんどだけど、たまに特殊な処理が必要なときがあるので一応覚書しておく。