シートモジュールのWorksheet_Changeイベントを使うと特定のセルの値が変更されたときだけ処理を行うことができます。
下のプログラムはセルの範囲「A8:A17」の値を変更したときにVLOOKUP関数が自動で実行されて同じシート内の「商品名と単価」の表から単価を取得して「C8:C17」のセルに表示します。
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo メッセージ '商品名が違うときはメッセージを表示して終了します。
If Intersect(Target, Range("A8:A17")) Is Nothing Then
MsgBox "入力するセルの範囲が「A8:A17」ではありません。"
Exit Sub
Else 'セルの範囲「A8:A17」の値を変更したら処理を実行します。
If Target.Value = "" Then '「A8:A17」のセルが空白の場合は「C8:C17」のセルも空白になります。
Application.EnableEvents = False 'イベントループしないようにイベントを無効にします。
Target.Offset(0, 2) = ""
Application.EnableEvents = True 'イベントを有効にします。
Else
Application.EnableEvents = False
Target.Offset(0, 2) = WorksheetFunction.VLookup(Target, Range("F:G"), 2, False)
Application.EnableEvents = True
End If
End If
Exit Sub
メッセージ:
MsgBox "商品名が違います。"
Application.EnableEvents = True
End Sub
VBAを使うとセルに関数式を入れずに処理を実行できるのでエクセルの作業に慣れていない方が操作しても関数式を消してしまったりするミスがなく安心して使えると思います。(^^♪
コメント