Excel VBA:特定のセルの値が変更されたとき(更新後処理イベント)だけVBAのプログラムを実行する方法
セルに設定できる標準の機能では足りなかったり、やりたい処理と微妙に違っていてオリジナルの処理を実行させたいときに使える。
以下VBAのサンプルプログラムと説明。
セルの内容が変更された時に呼び出されるイベントプロシージャ"Worksheet_Change"イベント
基本的にセルに変更があった際にプログラムを実行したい場合は、対象のワークシートの"Worksheet_Change"イベントに記述する。
“Worksheet_Change"イベントは、引数として"Target"というRangeオブジェクトを持っていて、"Target"引数を使って現在のセルの番地などを調べることができる。
“Worksheet_Change"イベントの記述は、[ツール]メニューの[マクロ]から[Visual Basic Editor]を選択して、[Visual Basic Editor]の画面左側のウィンドウから対象となるシートをダブルクリックする。
対象となるシートのモジュールシートが表示されるので上部コンボボックスから"WorkSheet"を選択し、右のコンボボックスから"Change"を選択する。
コンボボックスから"Change"を選択するとモジュールシートに以下のコードが表示される。
Private Sub Worksheet_Change(ByVal Target As Range)
・・・実行したい処理を記述
End Sub
以降にサンプルプログラムを紹介する。
例1:Sheet1のセルのA1からC30までの範囲のセルに値に変更があった場合にメッセージボックス(MsgBox)を表示する。
Private Sub Worksheet_Change(ByVal Target As Range)
'A1からC10を1行目から10行目までかつ1列目から3列目までという条件
If (Target.Row >= 1 And Target.Row <= 10) And (Target.Column >= 1 And _
Target.Column <= 3) Then
'セルの値に変更があったときに実行したい処理を記述
MsgBox "Hello Excel"
End If
End Sub
例2:A1からA10、C1からC10など、対象のセル範囲が離れている場合
Private Sub Worksheet_Change(ByVal Target As Range)
'条件を分けて記述
If (Target.Row >= 1 And Target.Row <= 10) And Target.Column = 1 Then '実行したい処理を記述したサブプロシージャを呼び出す Call Sample01 End If If (Target.Row >= 1 And Target.Row <= 10) And Target.Column = 3 Then
'実行したい処理を記述したサブプロシージャを呼び出す
Call Sample01
End If
End Sub
'条件に設定されたセル範囲で値の変更があったときに実行されるプログラム
Sub Sample01()
MsgBox "Hello Excel"
End Sub
上記のサンプルプログラムでは、条件が2つに分かれており、それぞれに同じ処理を記述するのは面倒なので、実際に実行したい処理を別のプロシージャに記述して、それを呼び出すことによってその手間を省くようにしている。
全部のシートの決まったセル範囲に設定したい場合は、WorkBookの"Workbook_SheetChange"イベントに記述すればよい。
“Workbook_SheetChange"も同じように"Target"引数を持っているので同じように条件設定すれば問題ない。
ちなみに"Workbook_SheetChange"イベントは、"Sh"引数を持っていて、これは選択されているSheetを表すオブジェクト変数になっている。
例えば、Sheet1とSheet3の同じセル範囲だけで値の変更時に処理をしたい場合は、まず"Sh"引数で選択されているシートを調べる条件を設定すればよい。
例3:Sheet1とSheet3のA1からC10までのセルの値に変更があったときにプログラムを実行
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
'Sh引数を使用した条件指定
If Sh.Name = "Sheet1" Or Sh.Name = "Sheet3" Then
'A1からC10を1行目から10行目までかつ1列目から3列目までという条件
If (Target.Row >= 1 And Target.Row <= 10) And (Target.Column >= 1 And _
Target.Column <= 3) Then
'セルの値に変更があったときに実行したい処理を記述
MsgBox Sh.Name & "の" & Target.Address & "の値が変更されました。"
End If
End If
End Sub
こんなことをしなくてもExcelの標準機能でできることがほとんどだけど、たまに特殊な処理が必要なときがあるので一応覚書しておく。
ディスカッション
コメント一覧
まだ、コメントがありません