燈明ブログ

現状は小池啓仁の応援ブログ

ExcelVBAでWorksheet_Changeサブルーチンの作成留意点

VBAのWorksheet_Changeサブルーチンは、セルが書き換えられた時に起動されます。
その時に、システムから書き換えられたRangeオブジェクトが渡されます。


このRangeオブジェクトは、実は、一つのセルだけでなく、複数のセルの場合もあるのです。
また、空の場合もあるのです。


要は、複数セルをDelキーで削除したり、単一セルをDelキーで削除したり・・・。
すると、Rangeオブジェクトは一つのセルデータでなく、配列だったり、空だったりするのです。


その場合、処理をしないようにするには、以下のようにします。
複数セルをDelキーで削除した場合は、配列で、IsArray関数を使います。
単一セルをDelキーで削除した場合は、空で、IsEmpty関数を使います。

サンプル

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Sheet2 As Worksheet
Dim Sheet_Save As Worksheet

    '配列だったら Exit Sub
    If IsArray(Target.Cells.Value) Then Exit Sub
    '空だったら Exit Sub
    If IsEmpty(Target.Cells.Value) Then Exit Sub

    Set Sheet_Save = ActiveSheet
    Set Sheet2 = Worksheets("Sheet2")
    Sheet2.Activate
    
    '任意シート(例ではSheet2)の任意の処理を記述する。
    MsgBox "Sheet2"
    
    Sheet_Save.Activate
    Set Sheet_Save = Nothing
    Set Sheet2 = Nothing
End Sub

まぁ、もちろん、複数のセルや空のセルに対する処理が必要な場合は、Exit Subしないでその処理を記述します。