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

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


ワークシートの特定のセルで値に変更(いわゆる更新後処理イベント)があったときにVBAのプログラムを実行する方法のサンプルプログラムを紹介する。
例えば、A1からA10までのセルに値の入力などのイベントが発生したときにVBAのプログラムが実行されるようにする方法。

セルに設定できる標準の機能では足りなかったり、やりたい処理と微妙に違っていてオリジナルの処理を実行させたいときに使える。
以下VBAのサンプルプログラムと説明。

基本的にセルに変更があった際にプログラムを実行したい場合は、対象のワークシートの"Worksheet_Change"イベントに記述する。
"Worksheet_Change"イベントは、引数として"Target"というRangeオブジェクトを持っていて、"Target"引数を使って現在のセルの番地などを調べることができる。
"Worksheet_Change"イベントの記述は、[ツール]メニューの[マクロ]から[Visual Basic Editor]を選択して、[Visual Basic Editor]の画面左側のウィンドウから対象となるシートをダブルクリックする。
対象となるシートのモジュールシートが表示されるので上部コンボボックスから"WorkSheet"を選択し、右のコンボボックスから"Change"を選択する。

以下サンプルプログラム。
例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の標準機能でできることがほとんどだけど、たまに特殊な処理が必要なときがあるので一応覚書しておく。

関連エントリー:

Loading ...


Comments:0

Comment Form

Trackback+Pingback:0

TrackBack URL for this entry
http://billyboy.blog81.fc2.com/tb.php/224-47523d79
Listed below are links to weblogs that reference
Excel VBA:特定のセルの値が変更されたとき(更新後処理イベント)だけVBAのプログラムを実行する方法 from 覚書 - My Knowledge Base - FC2ブログ版

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

記事検索
PR

ブログタイムズ

最新記事
タグクラウド

Page Top