どのシートでもWorkbook_SheetChange
イベントマクロ 17回
どのシートが変更されても処理をする
シートのイベントにWorksheet_Changeイベントがあり、実行したいシートモジュールに記述しました。
今回は、ブックレベルでイベントを実行したいときに、つかうイベントです。
ブックのどのシートでも、セルのデータが変更されたときに自動実行されます。
ブックモジュールに記述します。
(サンプルファイルは、こちらから
イベントマクロ17回サンプルデータ)
Workbook.SheetChange イベント
SheetChange の構文
Workbook_SheetChange(ByVal Sh As Object, ByVal Source As Range)
引数名 | データ型 | 説明 |
---|---|---|
Sh | Object | シートを表す Worksheet オブジェクトが渡されます。 |
Target | Range | 変更された範囲が渡されます。 |
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) ’処理したい内容をここに記述 End Sub
変更されたらメッセージWorkbook.SheetChange イベント
1.ではWorkbook.SheetChange イベント を使って、セルに変更があった場合に、メッセージボックスで知らせることにします。
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) MsgBox "セルが変更されました。" & vbCrLf & _ "シート:" & Sh.Name & vbCrLf & _ "セルアドレス:" & Target.Address End Sub
変更されたら書式を変えるWorkbook.SheetChange イベント
2. セルに変更があった場合に、そのセルの書式を変更して強調してみることにしましょう。
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) MsgBox "セルが変更されました。" & vbCrLf & _ "シート:" & Sh.Name & vbCrLf & _ "セルアドレス:" & Target.Address End Sub
シートや範囲を限定して処理を実行したい場合
3. Workbook.SheetChange イベントですべてのシートを対象にセルの変更があった場合に処理を実行することは、今までのコードを参考に作成できると思います。
今度は、シートが大量にあるけれど、そのなかの限定したシートを対象に処理したい場合のコードです。
たとえば、Sheet1とSheet2を対象にして、さらにその変更された範囲を限定しましょう。
ここでは、行と列を限定することにします。
シート名がSheet1かSheet2なら
If Sh.Name = "Sheet1" Or Sh.Name = "Sheet2" Then
Targetが2行から5行の間、列が2列から5列の間にある
If (Target.Row >= 2 And Target.Row <= 5) And (Target.Column >= 2 And Target.Column <= 5) Then
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Sh.Name = "Sheet1" Or Sh.Name = "Sheet2" Then If (Target.Row >= 2 And Target.Row <= 5) And (Target.Column >= 2 And _ Target.Column <= 5) Then MsgBox "セルが変更されました。" & vbCrLf & _ "シート:" & Sh.Name & vbCrLf & _ "セルアドレス:" & Target.Address End If End If End Sub
4. 引数のShを使って、If文で"Sheet1"または"Sheet2"とシートを限定し、 さらに、If文の入れ子で列と行を限定しています。
範囲を限定するApplicationオブジェクトのIntersectメソッド
5.上記4の例で、範囲を限定するために、ApplicationオブジェクトのIntersectメソッドを使うこともできます。
Targetが範囲にないときは、IntersectメソッドはNothingを返します。
Targetが範囲にあるときに、処理を行いたいので、ここのコードは
If Not Application.Intersect(Target, Range("A2:E5")) Is Nothing Thenのように記述します
コード全体は以下のように記述しました。
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Sh.Name = "Sheet1" Or Sh.Name = "Sheet2" Then If Not Application.Intersect(Target, Range("A2:E5")) Is Nothing Then MsgBox "セルが変更されました。" & vbCrLf & _ "シート:" & Sh.Name & vbCrLf & _ "セルアドレス:" & Target.Address End If End If End Sub
次回はシートがアクティブになった時に処理をするイベントを紹介します。