VBAで入力ミスを自動検出するには、IsNumeric・IsDate・空欄チェックをループで全行に適用し、問題のある行番号とエラー内容をまとめてメッセージで表示するだけです。目視確認では見逃しがちな空白・型違い・形式エラーを一瞬で洗い出せます。
この記事では、次の内容を順番に解説します。
- 空欄・数値・日付形式を一括チェックする基本コード
- エラー箇所にセルの色付けをして視覚的に強調する方法
- 入力と同時にリアルタイムでチェックする方法
- チェック結果を別シートに書き出す方法
入力ミスを一括チェックするには?
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が初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



