〖ExcelVBA〗セルの入力値をチェックしてエラーメッセージを出すマクロ|入力ミスをその場で防ぐ

ExcelVBA

Excelで入力フォームや管理表を作ると、よく起きるのが入力ミスです。

  • 数値のはずなのに文字が入る
  • 必須なのに空白のまま
  • 桁数がバラバラ(電話番号・IDなど)
  • 日付の形式が崩れる

入力規則(ドロップダウンなど)でも防げますが、
「もっと細かいルールでチェックしたい」場合はVBAが便利です。

そこで今回は、セルに入力された値をチェックして、条件に合わなければエラーメッセージを出すマクロを紹介します。
入力した瞬間にチェックするので、後から修正する手間も減ります。


スポンサーリンク
スポンサーリンク

この記事でできること

  • 指定セル(または指定列)への入力を監視
  • 条件に合わない入力ならエラーメッセージを表示
  • 入力を元に戻す(取り消し)ことも可能
  • 数値範囲、必須入力、文字数、日付などに対応

重要:この仕組みは「Worksheet_Change」に書く

今回のマクロは「セルが変更された瞬間」に動かしたいので、
標準モジュールではなく、対象シートのコードに書きます。

  1. Alt + F11 でVBE(VBAエディタ)を開く
  2. 左側の「Microsoft Excel Objects」から、対象シート(例:Sheet1)をダブルクリック
  3. そこにコードを貼り付ける

基本:特定の列だけ入力チェックしてエラーメッセージを出す(コピペ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

この形なら貼り付けにも強くなります。


まとめ:入力チェックを入れるだけでミスが激減する

入力ミスは、後から探して直すほど時間がかかります。
入力した瞬間にチェックできる仕組みを入れると、

  • ミスがその場で分かる
  • 集計や提出前のチェックが楽になる
  • 誰が入力しても一定の品質になる

というメリットがあります。

まずは「よくミスが起きる列」だけでも導入すると効果が大きいので、ぜひ試してみてください。

スポンサーリンク
スポンサーリンク
ExcelVBA
いがぴをフォローする

コメント

タイトルとURLをコピーしました