Worksheet_SelectionChangeイベントはセルを選択したときに処理を行うことができます。
Worksheet_Changeイベントはセルの値が変更されたときに処理を行うことができます。
次のコードは「Worksheet_SelectionChange」イベントで入力できるセル範囲の指定をしてから「Worksheet_Change」イベントでセルの範囲「A8:A17」の値を変更したときにVLOOKUP関数を実行し、同じシート内の「商品名と単価」の表から単価を取得して「C8:C17」のセルに表示するプログラムです。
Private Sub Worksheet_SelectionChange(ByVal Target As Range) 'セルが選択がされたときに自動的に実行されるイベント
If Not Intersect(Target, Range("A3,A8:A17,B8:B17,D4,D5")) Is Nothing Then '右のセル範囲が選択された場合は
Exit Sub '何もせずにプログラムを終了します
ElseIf Not Intersect(Target, Range("A18")) Is Nothing Then 'セルA18が選択された場合は
Application.EnableEvents = False 'イベントループしないようにイベントを無効にします
Range("A17").Select 'セルA17を選択します
Application.EnableEvents = True 'イベントを有効にします
ElseIf Not Intersect(Target, Range("B18")) Is Nothing Then 'セルB18が選択された場合は
Application.EnableEvents = False
Range("B17").Select 'セルB17を選択します
Application.EnableEvents = True
Else '上記のセル以外が選択された場合は
Application.EnableEvents = False
MsgBox "入力するセルの範囲ではありません。" 'メッセージを表示します
Application.EnableEvents = True
End If
End Sub
Private Sub Worksheet_Change(ByVal Target As Range) 'セルの値が変更されたときに自動的に実行されるイベント
On Error GoTo メッセージ '商品名が間違っていたときは行ラベル「メッセージ:」に移動する
If Not Intersect(Target, Range("A8:A17")) Is Nothing Then 'セルA8:A17の値が変更された場合の処理
If Target.Value = "" Then 'セルA8:A17に文字が入力されていない場合は
Application.EnableEvents = False 'イベントループしないようにイベントを無効にします
Target.Offset(0, 2) = "" '2列右のセルの内容をクリアします
Application.EnableEvents = True 'イベントを有効にします
Else '商品名が正しく入力された場合の処理
Application.EnableEvents = False
Target.Offset(0, 2) = WorksheetFunction.VLookup(Target, Range("F:G"), 2, False) 'VLookup関数を実行します
Application.EnableEvents = True
End If
End If
Exit Sub 'プログラムを終了します
メッセージ: 'エラー発生時の処理
Application.EnableEvents = False
MsgBox "商品名が違います。" 'エラーメッセージ表示
Target.Offset(0, 2) = "" '2列右のセルの内容をクリアします
Application.EnableEvents = True
End Sub

VBAを使うとセルに関数式を入れずに処理を実行できるのでエクセルの作業に慣れていない方が操作しても関数式を消してしまったりするミスがなく安心して使えると思います。(^ᴗ^♪
コメント