セルに設定できる標準の機能では足りなかったり、やりたい処理と微妙に違っていてオリジナルの処理を実行させたいときに使える。
以下VBAのサンプルプログラムと説明。
Worksheet_Changeイベントについて
今回はセルの内容が変更された時に呼び出されるイベントプロシージャ"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
以降にサンプルプログラムを紹介しますが、セルに入力した値や値リストから選択した値によって絞り込んだ結果を別のセルの値リストに設定する方法については、以下の記事を参照してください。
サンプルプログラム No.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
サンプルプログラム No.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"引数で選択されているシートを調べる条件を設定すればよい。
サンプルプログラム No.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
まとめ
セルの値に変更があったときをトリガにプログラムを動作させたい場合は「Worksheet_Change」イベントを使用します。
状況によっては、「Workbook_SheetChange」イベントを使用します。
各イベントプロシージャの引数を参照することでどのセルに変更があったか判断することができます。
例えばA1セルで選択された値に基づいてB1セルで選択できる値を変更したい場合などは、今回のサンプルプログラムを利用した以下の記事がありますので参考にしてください。
コメント