目次
経緯
Excelでは、セルを編集できないようにするには「セルのロック → シート保護」といった操作が必要です。
しかし、この手順は毎回設定が面倒で、VBAで同じような機能を実装できないかと思い、今回調べてみました。
結果として、Worksheet_Changeイベントを使えば、特定のセルへの入力を即時にキャンセルできる方法が見つかりましたので、紹介いたします。
実現したいこと
- セル
J5~J7
およびM5
に対して編集を禁止したい - それらのセルに値が入力された瞬間に、入力をキャンセルし、エラーメッセージを表示したい
実装コード(Worksheet_Change使用)
以下のVBAコードを、対象のワークシートのコードウィンドウ(例:Sheet1)に貼り付けてください。
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("M5,J5:J7")) Is Nothing Then
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
MsgBox "このセルの編集は許可されていません。", vbExclamation
End If
End Sub
このコードの動作内容
Intersect(Target, Me.Range("M5,J5:J7"))
により、編集対象セルが禁止範囲に含まれているかを判定- 該当する場合は
Application.Undo
を使って編集を取り消し - その後、エラーメッセージをポップアップ表示
注意点
Application.EnableEvents = False
を使用しないと、無限ループに陥る可能性があります(Undoにより再度Changeイベントが発生するため)- セルの結合やシート保護との併用には注意が必要です
- 複数セルを一括で選択して削除・貼り付けなどを行った場合、意図した挙動にならないことがあります
応用例
- 入力済みセルの再編集防止(履歴保護)
- 社内テンプレートなどで、特定項目のみ編集可能にしたい場合
- 入力制限付きチェックリストや申請書の作成
まとめ
Worksheet_Change
イベントと Application.Undo
を組み合わせることで、特定のセルに対して即時の編集キャンセルが可能となります。
この方法なら、シート保護なしでも安全にセルを保護でき、柔軟な管理が可能です。
ぜひ業務の効率化やテンプレート管理に活用してみてください。
最後までお読みいただきありがとうございました。