VBAで「セルが空かどうか」を判定するとき、= "" だけでは不十分な場合があります。半角スペースが1つ入っているセルは = "" では「入力あり」と見なされてしまいます。状況に応じて Trim・IsEmpty・Len を使い分けることで、判定の精度が大きく変わります。
この記事では、次の内容を順番に解説します。
- 「= “”」だけでは拾えないケースとその原因
- Trimで空白を除去してから判定する方法
- IsEmptyとの違いと使い分け
- Len関数で文字数ゼロを確認する方法
- 複数列をまとめてチェックする実用コード
- よくある質問(数式が入っているセル・全角スペース・エラー値の扱い等)
「= “”」だけでは拾えないケースとその原因を理解するには?
次のコードは一見シンプルで正しそうですが、見逃すケースがあります。
If Cells(i, 1).Value = "" Then
MsgBox "未入力です"
End If
このコードが「入力あり」と誤判定してしまうのは、次のようなケースです。
| セルの状態 | = “” の判定結果 | 実際の状態 |
|---|---|---|
| 完全に空(何も入っていない) | True(空と判定) | 空 |
| 半角スペースが1つ入っている | False(入力ありと判定) | 実質空 |
| 全角スペースが入っている | False(入力ありと判定) | 実質空 |
| 空文字列を返す数式(=””)が入っている | True(空と判定) | 数式あり |
特に「他のシステムからコピーしたデータ」や「複数人が入力したシート」では、スペースが紛れ込んでいるケースが珍しくありません。
Trimで空白を除去してから判定するには?
前後のスペース(半角)を除去してから空かどうかを判定する書き方です。
If Trim(Cells(i, 1).Value) = "" Then
MsgBox "未入力です"
End If
Trim は文字列の前後にある半角スペースを取り除く関数です。「スペースだけが入ったセル」も空として扱いたい場面では、これが最も手軽な対処法です。
注意: VBAの Trim は前後の半角スペースだけを除去します。文字列の中間にあるスペースや全角スペースは除去されません。全角スペースも除去したい場合は Replace を組み合わせます。
' 全角スペースも除去してから判定する
Dim v As String
v = Replace(Cells(i, 1).Value, " ", "") ' 全角スペースを除去
v = Trim(v) ' 半角スペースを除去
If v = "" Then
MsgBox "未入力です"
End If
IsEmptyとの違いと使い分けを理解するには?
IsEmpty はセルが「一度も値を入れていない初期状態かどうか」を判定します。= "" との違いを正確に理解して使い分けましょう。
If IsEmpty(Cells(i, 1)) Then
MsgBox "何も入力されていません"
End If
IsEmpty と = "" の違いを一覧にまとめます。
| セルの状態 | IsEmpty | = “” |
|---|---|---|
| 完全に空(初期状態) | True | True |
| 空文字列を手入力(Delete後に””を入力) | False | True |
| 空文字列を返す数式(=””) | False | True |
| 半角スペースのみ | False | False |
| 文字列が入っている | False | False |
IsEmpty は「数式が入っているセルは空ではない」と判定するため、入力フォームの未入力チェックには向きません。一方、「このセルにまだ何も触れていないか」を確認したい場合(初期化チェックなど)には有効です。
Len関数で文字数ゼロを確認するには?
Len 関数は文字数を返します。Len(...) = 0 で空かどうかを確認できます。
If Len(Trim(Cells(i, 1).Value)) = 0 Then
MsgBox "未入力です"
End If
Trim と組み合わせることで、スペースのみのセルも0文字として判定できます。= "" との動作はほぼ同じですが、Len を使う書き方は「文字数で管理している」という意図が伝わりやすく、チェック処理の中で他の文字数条件(最低〇文字以上など)と並べて書くときに読みやすくなります。
複数列をまとめてチェックする実用コードを作るには?
入力フォームで「必須項目がすべて埋まっているか」を確認する場面でよく使うパターンです。
Sub CheckRequiredFields()
Dim i As Long
Dim lastRow As Long
Dim errorCount As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
errorCount = 0
For i = 2 To lastRow
' A列(氏名)・B列(部署)・C列(日付)を必須チェック
If Trim(Cells(i, 1).Value) = "" Or _
Trim(Cells(i, 2).Value) = "" Or _
Trim(Cells(i, 3).Value) = "" Then
Cells(i, 1).Interior.Color = RGB(255, 230, 230) ' 薄い赤でハイライト
errorCount = errorCount + 1
Else
Cells(i, 1).Interior.ColorIndex = xlNone
End If
Next i
If errorCount > 0 Then
MsgBox errorCount & " 行に未入力の必須項目があります。", vbExclamation, "入力チェック"
Else
MsgBox "すべての必須項目が入力されています。", vbInformation, "入力チェック"
End If
End Sub
未入力の行を赤くハイライトして件数を知らせることで、どこを修正すればいいかが一目でわかります。
まとめ
= ""は半角・全角スペースのみのセルを見逃す- スペースも未入力として扱うなら
Trim(...) = "" - 全角スペースも除去したいなら
ReplaceとTrimを組み合わせる IsEmptyは「一度も触れていない初期状態か」の確認に使う(入力チェックには不向き)Len(Trim(...))は文字数条件と組み合わせるときに読みやすい- 「何が空なのか」を定義してから判定方法を選ぶのがポイント
よくある質問
数式が入っているセルを「空」として扱いたい場合は?
= "" を使うと、空文字列を返す数式(例:=IF(A1="","",A1))が入ったセルも「空」と判定されます。一方 IsEmpty では「空ではない」と判定されます。数式の結果が空かどうかを見たい場合は = "" または Len(Trim(...)) を使いましょう。
セルにエラー値(#VALUE!など)が入っている場合はどう判定する?
エラー値が入っているセルに対して .Value を参照するとVBAがエラーになることがあります。IsError(Cells(i,1)) で事前にエラーセルかどうかを確認してから処理するのが安全です。
If IsError(Cells(i, 1)) Then
' エラー値が入っているセルへの対応
ElseIf Trim(Cells(i, 1).Value) = "" Then
MsgBox "未入力です"
End If
全角スペースだけが入ったセルをTrimで除去できない理由は?
VBAの Trim 関数は半角スペース(ASCII 32)のみを除去します。全角スペース(文字コード 12288)は別の文字として扱われるため除去されません。Replace(値, " ", "")(全角スペース)を先に通してから Trim に渡してください。
改行コードが入ったセルも空として扱いたい場合は?
Excelセル内改行は Chr(10) で表されます。Replace で除去してから判定します。
Dim v As String
v = Replace(Cells(i, 1).Value, Chr(10), "") ' 改行を除去
v = Replace(v, " ", "") ' 全角スペースを除去
v = Trim(v) ' 半角スペースを除去
If v = "" Then
MsgBox "未入力です"
End If
未入力セルの背景色をクリアするタイミングは?
チェックマクロを実行するたびに、まず全行の背景色をクリアしてからチェックを走らせると、前回の実行結果が残って混乱することを防げます。ループの前に Range(Cells(2, 1), Cells(lastRow, 1)).Interior.ColorIndex = xlNone を入れておきましょう。


