Excelで入力フォームや管理表を作ると、よく起きるのが入力ミスです。
- 数値のはずなのに文字が入る
- 必須なのに空白のまま
- 桁数がバラバラ(電話番号・IDなど)
- 日付の形式が崩れる
入力規則(ドロップダウンなど)でも防げますが、
「もっと細かいルールでチェックしたい」場合はVBAが便利です。
そこで今回は、セルに入力された値をチェックして、条件に合わなければエラーメッセージを出すマクロを紹介します。
入力した瞬間にチェックするので、後から修正する手間も減ります。
この記事でできること
- 指定セル(または指定列)への入力を監視
- 条件に合わない入力ならエラーメッセージを表示
- 入力を元に戻す(取り消し)ことも可能
- 数値範囲、必須入力、文字数、日付などに対応
重要:この仕組みは「Worksheet_Change」に書く
今回のマクロは「セルが変更された瞬間」に動かしたいので、
標準モジュールではなく、対象シートのコードに書きます。
- Alt + F11 でVBE(VBAエディタ)を開く
- 左側の「Microsoft Excel Objects」から、対象シート(例:Sheet1)をダブルクリック
- そこにコードを貼り付ける
基本:特定の列だけ入力チェックしてエラーメッセージを出す(コピペOK)
例:B列(2列目)に「1〜100の数値」以外が入ったらエラーを出します。
エラーなら入力を取り消し(元に戻す)します。
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range
Set rng = Intersect(Target, Me.Columns(2)) ' B列だけ対象
If rng Is Nothing Then Exit Sub ' B列以外は無視
If rng.CountLarge > 1 Then Exit Sub ' 複数セル変更は無視(必要なら後述で対応)
' イベントの再発火を防ぐ(超重要)
Application.EnableEvents = False
' 空白は許可(必須にしたい場合は別の例を参照)
If Trim(CStr(rng.Value)) = "" Then GoTo Finally
' 数値チェック
If Not IsNumeric(rng.Value) Then
MsgBox "B列は数値で入力してください。", vbExclamation
Application.Undo
GoTo Finally
End If
' 範囲チェック(1~100)
If CDbl(rng.Value) < 1 Or CDbl(rng.Value) > 100 Then
MsgBox "B列は1~100の範囲で入力してください。", vbExclamation
Application.Undo
GoTo Finally
End If
Finally:
Application.EnableEvents = True
End Sub
初心者がつまずきやすいポイント
① EnableEvents をOFFにしないと無限ループになる
Worksheet_Change の中でセルを触ると、再び Worksheet_Change が動いてしまい、
マクロが暴走することがあります。
そのため、処理中だけ
Application.EnableEvents = False
で止めて、最後に必ず
Application.EnableEvents = True
で戻します。
② 入力を戻すなら Application.Undo が便利
Application.Undo
これで「直前の入力」を取り消せます。
ユーザーにとって分かりやすく、安全です。
よく使う入力チェック例(コピペで応用可)
① 必須入力(空白はNG)にしたい
例:C列が空白ならエラー
If Trim(CStr(rng.Value)) = "" Then
MsgBox "C列は必須入力です。空白は不可です。", vbExclamation
Application.Undo
GoTo Finally
End If
② 文字数チェック(例:IDは8文字)
例:D列は8文字のIDのみ許可
If Len(CStr(rng.Value)) <> 8 Then
MsgBox "IDは8文字で入力してください。", vbExclamation
Application.Undo
GoTo Finally
End If
③ 日付チェック(正しい日付だけ許可)
例:E列は日付のみ
If Not IsDate(rng.Value) Then
MsgBox "日付として正しく入力してください。(例:2026/01/05)", vbExclamation
Application.Undo
GoTo Finally
End If
④ 指定文字だけ許可(例:ステータスは「完了」「未対応」)
例:F列は「完了」「未対応」以外はNG
Select Case CStr(rng.Value)
Case "完了", "未対応"
' OK
Case Else
MsgBox "ステータスは「完了」または「未対応」で入力してください。", vbExclamation
Application.Undo
GoTo Finally
End Select
実務向け:複数セル貼り付けにも対応したい場合
貼り付けなどで複数セルが一度に変更されることもあります。
その場合は、セルを1つずつチェックする形に変えるのが安全です。
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range, c As Range
Set rng = Intersect(Target, Me.Columns(2)) ' B列だけ対象
If rng Is Nothing Then Exit Sub
Application.EnableEvents = False
For Each c In rng.Cells
If Trim(CStr(c.Value)) = "" Then GoTo NextCell
If Not IsNumeric(c.Value) Then
MsgBox "B列は数値で入力してください。", vbExclamation
Application.Undo
GoTo Finally
End If
If CDbl(c.Value) < 1 Or CDbl(c.Value) > 100 Then
MsgBox "B列は1~100の範囲で入力してください。", vbExclamation
Application.Undo
GoTo Finally
End If
NextCell:
Next c
Finally:
Application.EnableEvents = True
End Sub
この形なら貼り付けにも強くなります。
まとめ:入力チェックを入れるだけでミスが激減する
入力ミスは、後から探して直すほど時間がかかります。
入力した瞬間にチェックできる仕組みを入れると、
- ミスがその場で分かる
- 集計や提出前のチェックが楽になる
- 誰が入力しても一定の品質になる
というメリットがあります。
まずは「よくミスが起きる列」だけでも導入すると効果が大きいので、ぜひ試してみてください。


コメント