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しないでその処理を記述します。