CoCoのYDブログ

心に思い浮かんだことを少し掘り下げ発信します

【VBA】プログラム実行タイミング【セル変更時】

こんにちは

 

今日は特定のセルが変更された場合実行するプログラムを作成してみましょう。

自分の場合スケジュールの欄を作り、その欄の内容が変更された場合、予定一覧を変更するとかそんな感じで使用しますね。

意外と使えるのに使用例が思い浮かばないw

 

作成方法

今回はシートのほうに作成します。

f:id:takataka2743:20181004205649p:plain

 

今回は簡単に変更したセルの行をMsgboxで返すだけのプログラムです。

ただしすべてのセルに対して実行すると鬱陶しいので1~5行目のセルが変更した場合と条件をつけました。

Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Range("1:5")) Is Nothing Then
        Exit Sub
    Else
        MsgBox Target.Row
    End If
End Sub

 1行目:プロシージャの開始

    タイトルがWorksheet_Change

    引数をByVal Target As Range に設定してください

2行目:条件引数のTargetが1~5行目以外かどうか

3行目:条件にあった場合、プロシージャの終了

4行目:Else

5行目:Targetの行をMsgboxで返す

6行目:If文の終了

7行目:プロシージャの終了

 

解説

Worksheet_Change(ByVal Target As Range)でワークシートの内容が変更された場合、変数Targetにアクティブセルが代入されます。

 

Intersectメソッドは

Intersect(セル,セルの範囲)のように作成します。

セルの範囲に指定したセルがあれば、指定したセルを返しますが、セルがなかった場合はNotingとして値を返します。

 

2行目の If Intersect(Target, Range("1:5")) Is Nothing Thenでは

変更したセルが1~5行にあるかを確認してない場合はプロシージャの終了となっています。

 

蛇足ですが、この If ~ is Nothing Then の形は If Not ~ is Nothing Then の形に変更できます。

 

5行目ではTargetがRange型であることを利用して.Rowプロパティを使用しています。

 

こんな感じですね。

使いどころは多そうなWorksheet_Changeプロシージャを一度は使ってみてはいかがでしょうか?