VBAで入力ミスを自動検出してメッセージ表示する方法|IsNumeric・IsDate・Worksheet_Changeの組み合わせ

VBAで入力ミスを自動検出するには、IsNumericIsDate・空欄チェックをループで全行に適用し、問題のある行番号とエラー内容をまとめてメッセージで表示するだけです。目視確認では見逃しがちな空白・型違い・形式エラーを一瞬で洗い出せます。

この記事では、次の内容を順番に解説します。

  • 空欄・数値・日付形式を一括チェックする基本コード
  • エラー箇所にセルの色付けをして視覚的に強調する方法
  • 入力と同時にリアルタイムでチェックする方法
  • チェック結果を別シートに書き出す方法

入力ミスを一括チェックするには?

A列(氏名)・B列(年齢)・C列(日付)をすべての行でチェックし、エラーがあった行番号と内容をまとめてMsgBoxに表示します。

Sub CheckInputError()

    Dim ws      As Worksheet
    Dim i       As Long
    Dim lastRow As Long
    Dim errMsg  As String

    Set ws = ActiveSheet
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    errMsg = ""

    For i = 2 To lastRow

        'A列(氏名)が空欄
        If Trim(ws.Cells(i, 1).Value) = "" Then
            errMsg = errMsg & i & "行目:氏名が空欄です。" & vbCrLf
        End If

        'B列(年齢)が数値でない
        If ws.Cells(i, 2).Value <> "" Then
            If Not IsNumeric(ws.Cells(i, 2).Value) Then
                errMsg = errMsg & i & "行目:年齢が数値ではありません。" & vbCrLf
            End If
        Else
            errMsg = errMsg & i & "行目:年齢が空欄です。" & vbCrLf
        End If

        'C列(日付)が正しい日付でない
        If ws.Cells(i, 3).Value <> "" Then
            If Not IsDate(ws.Cells(i, 3).Value) Then
                errMsg = errMsg & i & "行目:日付の形式が不正です。" & vbCrLf
            End If
        Else
            errMsg = errMsg & i & "行目:日付が空欄です。" & vbCrLf
        End If

    Next i

    If errMsg <> "" Then
        MsgBox "入力エラーが見つかりました:" & vbCrLf & vbCrLf & errMsg, vbExclamation
    Else
        MsgBox "入力ミスは見つかりませんでした。", vbInformation
    End If

End Sub

エラー箇所をセルの色付けで強調するには?

MsgBoxのメッセージだけでなく、エラーのあるセルを赤く色付けすると、どこを直せばいいか一目でわかります。

Sub CheckAndHighlight()

    Dim ws      As Worksheet
    Dim i       As Long
    Dim lastRow As Long
    Dim errCount As Long

    Set ws = ActiveSheet
    lastRow  = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    errCount = 0

    '先にすべてのA〜C列の色をリセット
    ws.Range("A2:C" & lastRow).Interior.ColorIndex = xlNone

    For i = 2 To lastRow

        'A列:空欄チェック
        If Trim(ws.Cells(i, 1).Value) = "" Then
            ws.Cells(i, 1).Interior.Color = RGB(255, 200, 200)   '薄い赤
            errCount = errCount + 1
        End If

        'B列:数値チェック
        If Not IsNumeric(ws.Cells(i, 2).Value) Or ws.Cells(i, 2).Value = "" Then
            ws.Cells(i, 2).Interior.Color = RGB(255, 200, 200)
            errCount = errCount + 1
        End If

        'C列:日付チェック
        If Not IsDate(ws.Cells(i, 3).Value) Or ws.Cells(i, 3).Value = "" Then
            ws.Cells(i, 3).Interior.Color = RGB(255, 200, 200)
            errCount = errCount + 1
        End If

    Next i

    If errCount > 0 Then
        MsgBox errCount & " 件のエラーが見つかりました。赤いセルを確認してください。", vbExclamation
    Else
        MsgBox "入力ミスはありません。", vbInformation
    End If

End Sub

入力と同時にリアルタイムでチェックするには?

Worksheet_Change イベントを使うと、セルに値を入力した瞬間に自動でチェックが走ります。B列(年齢)に数値以外が入力されたらすぐ警告する例です。

'シートモジュールに記述する
Private Sub Worksheet_Change(ByVal Target As Range)

    'B列への入力だけを対象にする
    If Not Intersect(Target, Range("B:B")) Is Nothing Then

        If Target.Row = 1 Then Exit Sub   '見出し行はスキップ

        If Target.Value <> "" Then
            If Not IsNumeric(Target.Value) Then
                Application.EnableEvents = False
                MsgBox Target.Row & "行目:年齢には数値を入力してください。", vbExclamation
                Target.Interior.Color = RGB(255, 200, 200)
                Application.EnableEvents = True
            Else
                Target.Interior.ColorIndex = xlNone   'エラーなしは色をリセット
            End If
        End If

    End If

End Sub

チェック結果を別シートに書き出すには?

エラーの一覧を「チェック結果」シートに書き出すと、後から確認・修正依頼に使えます。

Sub CheckAndExport()

    Dim wsSrc  As Worksheet
    Dim wsDst  As Worksheet
    Dim i      As Long
    Dim dstRow As Long
    Dim lastRow As Long

    Set wsSrc = Worksheets("データ")
    Set wsDst = Worksheets("チェック結果")

    wsDst.Cells.ClearContents
    wsDst.Cells(1, 1).Value = "行番号"
    wsDst.Cells(1, 2).Value = "エラー内容"

    lastRow = wsSrc.Cells(wsSrc.Rows.Count, 1).End(xlUp).Row
    dstRow  = 2

    For i = 2 To lastRow

        If Trim(wsSrc.Cells(i, 1).Value) = "" Then
            wsDst.Cells(dstRow, 1).Value = i
            wsDst.Cells(dstRow, 2).Value = "氏名が空欄"
            dstRow = dstRow + 1
        End If

        If Not IsNumeric(wsSrc.Cells(i, 2).Value) Or wsSrc.Cells(i, 2).Value = "" Then
            wsDst.Cells(dstRow, 1).Value = i
            wsDst.Cells(dstRow, 2).Value = "年齢が数値でない"
            dstRow = dstRow + 1
        End If

    Next i

    If dstRow = 2 Then
        MsgBox "エラーはありませんでした。", vbInformation
    Else
        MsgBox dstRow - 2 & " 件のエラーを「チェック結果」シートに書き出しました。", vbExclamation
    End If

End Sub

まとめ

  • IsNumeric・IsDate・空欄チェック を組み合わせると、型違い・空白・形式ミスを網羅的に検出できる
  • エラーメッセージは 行番号と内容を文字列に連結してMsgBoxでまとめて表示するのが実用的
  • エラーセルを 赤く色付けすると修正箇所が一目でわかる
  • Worksheet_Change と組み合わせると入力と同時にリアルタイムチェックができる
  • エラー一覧を 別シートに書き出すと修正依頼や記録に使いやすい

よくある質問

IsNumericで全角数字もTrueになりますが大丈夫ですか?

IsNumericは全角数字(「123」など)もTrueを返します。半角数字のみを許可したい場合は、追加で Trim(str) = CStr(CLng(Trim(str))) のような変換チェックを入れるか、正規表現(RegExp)を使う方法があります。

日付の形式をyyyy/mm/ddに限定したいです

IsDateはさまざまな日付形式を許容します。特定の形式に限定するには、Format(CDate(val), "yyyy/mm/dd") = val のように変換後の文字列と元の文字列を比較する方法や、正規表現で「4桁/2桁/2桁」のパターンに一致するかを確認する方法があります。

チェック項目を増やしたいです

ループ内に If 条件を追加するだけです。チェック項目が増えてきたら、各チェックを関数(Function)に分けて呼び出す設計にすると整理しやすくなります。

色付けをリセットするマクロも用意したいです

ws.Range("A2:C" & lastRow).Interior.ColorIndex = xlNone で指定範囲の色をまとめてリセットできます。チェック前に毎回リセットする処理を入れておくと、前回のエラー表示が残りません。

Worksheet_Changeで複数列をチェックしたいです

Intersect(Target, Range("A:C")) のように複数列を指定すれば、A〜C列のどれかが変更されたときに反応させられます。変更されたセルの列番号は Target.Column で確認できるため、列ごとに異なるチェック処理を分岐させることも可能です。


動画で学びたい方へ

「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。

VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。

動画で学ぶExcelマクロ|JIMOVEオンラインスクール

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール