どのシートでもWorkbook_SheetChange

ブックのどのシートでも、セルのデータが変更されたときに自動実行されるのはWorkbook_SheetChange
ブックのどのシートでも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-1

変更されたら書式を変えるWorkbook.SheetChange イベント

2. セルに変更があった場合に、そのセルの書式を変更して強調してみることにしましょう。

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
	MsgBox "セルが変更されました。" & vbCrLf & _
        "シート:" & Sh.Name & vbCrLf & _
        "セルアドレス:" & Target.Address
End Sub

ブックのどのシートでもWorkbook_SheetChange-2

シートや範囲を限定して処理を実行したい場合

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文の入れ子で列と行を限定しています。


ブックのどのシートでもWorkbook_SheetChange-3

範囲を限定するApplicationオブジェクトのIntersectメソッド

5.上記4の例で、範囲を限定するために、ApplicationオブジェクトのIntersectメソッドを使うこともできます。
Targetが範囲にないときは、IntersectメソッドはNothingを返します。
Targetが範囲にあるときに、処理を行いたいので、ここのコードは

 If Not Application.Intersect(Target, Range("A2:E5")) Is Nothing Then
のように記述します


ブックのどのシートでもWorkbook_SheetChange-4

コード全体は以下のように記述しました。

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

次回はシートがアクティブになった時に処理をするイベントを紹介します。