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

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

以下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

以降にサンプルプログラムを紹介しますが、セルに入力した値や値リストから選択した値によって絞り込んだ結果を別のセルの値リストに設定する方法については、以下の記事を参照してください。

Excel VBA:セルで選択された値によって別のセルで選択できる値リストの内容を変更(絞り込み)する方法
VBAで値リストが設定されるセルで値が選択された際に別のセルの値リストの内容を書き換える方法について覚書。 例えば大分類、小分類など2つのセルを関連付けて大分類で選択された値によって小分類に表示される値を絞り込んで値リストに設定したい場合に...

サンプルプログラム 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セルで選択できる値を変更したい場合などは、今回のサンプルプログラムを利用した以下の記事がありますので参考にしてください。

Excel VBA:セルで選択された値によって別のセルで選択できる値リストの内容を変更(絞り込み)する方法
VBAで値リストが設定されるセルで値が選択された際に別のセルの値リストの内容を書き換える方法について覚書。 例えば大分類、小分類など2つのセルを関連付けて大分類で選択された値によって小分類に表示される値を絞り込んで値リストに設定したい場合に...

コメント

タイトルとURLをコピーしました