Worksheet.Changeイベントマクロ 09回
セルの値が変わったときにマクロを実行したいという場合があります。
セルの値が変わった時にマクロを実行するには、Worksheet_Changeプロシージャを使って行うことができます。
Worksheet_Changeプロシージャは、マクロを実行したいシートのコード画面に作成します。
1. Visual Basic Editorを起動します。Sheet1を選択してコード画面を表示させて、オブジェクトボックスをクリックします。するとデフォルトのWorksheet_SelectionChangeプロシージャが入力されますが、これは削除して大丈夫です。

2. プロシージャボックスから、Changeイベントを選択します。間に実行したいコードを記述します。
Private Sub Worksheet_Change(ByVal Target As Range)
'実行したいコード
End Sub

3. Sheet1に戻り、C5セルに値を入力しました。数値を入力したセルの背景色が変更されました。

4. もうすこし、マクロらしいコードを作成してみましょう。購入金額に応じて、割引率を隣のセルに表示するというマクロです。
この場合、入力するターゲットをC列に限定したいのでIntersectメソッドを利用します。
.Intersect (Arg1, Arg2, Arg3,....)のように、引数にはセル範囲 (Range オブジェクト) の名前を指定します。
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Columns(3)) Is Nothing Then
Select Case Target.Value
'実行したいコード
End Select
End If
End Sub
Select Caseで、金額による割引を3通り設定しました。

5. コードは、以下のようになります。値を入力したセルの隣に割引額が入力されます。が、ここで、す
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Columns(3)) Is Nothing Then
Select Case Target.Value
Case Is <= 10000
Target.Offset(0, 1).Value = Target.Value * 0.1
Case Is <= 20000
Target.Offset(0, 1).Value = Target.Value * 0.2
Case Is > 20001
Target.Offset(0, 1).Value = Target.Value * 0.3
End Select
End If
End Sub
6.前のコードでミスに気付いて金額を一旦消去するという場合、エラーになってしまうので、それを防ぐためにコードを追加します。
データを消した場合は、隣のセルも値も消すというコードです。
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Columns(3)) Is Nothing Then
Select Case Target.Value
Case Is = ""
Target.Offset(0, 1).Value = ""
Exit Sub
Case Is <= 10000
Target.Offset(0, 1).Value = Target.Value * 0.1
Case Is <= 20000
Target.Offset(0, 1).Value = Target.Value * 0.2
Case Is > 20001
Target.Offset(0, 1).Value = Target.Value * 0.3
End Select
End If
End Sub
すでに入力した値を消してもエラーにならず、隣のセルの値も消去されています。
