教えて!ExcelVBA!

ExcelVBAの基礎知識・書き方について紹介します。

【ExcelVBA シート操作】シートが変更された時に発生するイベントプロシージャを作成するにはどうすればいいの?教えて!

構文

構文は以下の通りです。

Private Sub Worksheet_Change(ByVal Target As Range)
    ' 実行したいコードをここに記述する
End Sub

Worksheet_Changeイベントプロシージャは、Excelのシート上でデータが変更されたときに自動的に実行されます。引数は以下の内容となります。

引数 内容
Target 変更が行われたセルの範囲を表します。

プログラミング例

以下に、具体的な例を幾つか紹介します。

例1: 入力値の制限

Worksheet_Changeイベントプロシージャを使って、入力値の制限を行う例です。

Private Sub Worksheet_Change(ByVal Target As Range)
    ' セルB2の値が10を超える場合、エラーメッセージを表示して元に戻す
    If Target.Address = "$B$2" Then
        If Target.Value > 10 Then
            MsgBox "エラー:値は10以下にしてください。"
            Application.EnableEvents = False
            Target.Value = Target.ValueOld
            Application.EnableEvents = True
        End If
    End If
End Sub

この例では、セルB2の値が10を超える場合にエラーメッセージを表示し、元の値に戻します。Worksheet_Changeイベントプロシージャが実行されるたびに、変更されたセルがセルB2であるかを判定し、条件に合致する場合にはエラーメッセージを表示します。

例2: データの自動整形

Worksheet_Changeイベントプロシージャを使って、データの自動整形を行う例です。

Private Sub Worksheet_Change(ByVal Target As Range)
    ' セル範囲が変更されたらデータを自動的に整形する
    If Not Intersect(Target, Range("A1:C10")) Is Nothing Then
        Application.EnableEvents = False
        ' データの整形処理
        For Each Cell In Target
            Cell.Value = UCase(Cell.Value)
        Next Cell
        Application.EnableEvents = True
    End If
End Sub

この例では、セル範囲A1:C10のデータが変更された場合に、セルの値を大文字に変換する処理を行います。Worksheet_Changeイベントプロシージャが実行されるたびに、変更されたセルが対象の範囲内にあるかを判定し、条件に合致する場合にはデータを自動的に整形します。

まとめ

Worksheet_Changeイベントプロシージャは、データの変更を自動的に検知し、特定の処理を実行するための重要な機能です。対象のシートにWorksheet_Changeイベントプロシージャを実装することで、入力値の制限やデータの自動整形します。是非活用してください。