2025年1月30日に”【VBA】ワークシートを保護する”を投稿しましたが、今回はそれと同様の設定をイベントプロシージャを使ってできるようにしたいと思います。
次のような注文書を例にして、取引先会社名「セルA3」、商品名と数量「セル範囲A8からB17」、発行日「セルD4」、発注番号「セルD5」は入力できるようにして、それ以外のセルは入力できないように設定を行います。


VBE(Visual Basic Editor)を起動して「Sheet1」をダブルクリックし、次のコードをコピーして貼り付けます。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("A3,A8: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
ElseIf Not Intersect(Target, Range("C8:C17")) Is Nothing Then 'セルC8からC17の範囲が選択された場合は。
Application.EnableEvents = False
Cells(ActiveCell.Row, 2).Select '現在アクティブなセルと同じ行にあるB列のセルを選択します。
Application.EnableEvents = True
ElseIf Not Intersect(Target, Range("B7")) Is Nothing Then 'セルB7が選択された場合は。
Application.EnableEvents = False
Range("B8").Select 'セルB8を選択します。
Application.EnableEvents = True
Else '上記で選択されたセル以外のセルが選択された場合は。
Application.EnableEvents = False
Range("A8").Select 'セルA8を選択します。
Application.EnableEvents = True
End If
End Sub
条件による分岐が多くて少し長いコードになりましたが、これで指定したセルをクリックしたときにプログラムが自動で実行されて「シートの保護」をしたときと同じ状態を実現することができました。
今回は特定のセルだけを入力可能にする設定をしました。イベントプロシージャを使うと使用者がセルを選択したりセルの内容を変更したりしたときに自動的に処理を実行できるのでアイデア次第でいろいろなことができるかと思います。(˶•ᴗ•˵♪
コメント