VBAのMsgBoxとInputBoxを使い分ける方法|ボタン・アイコン・セル選択ダイアログの実用パターン

VBAで「セルが空かどうか」を判定するとき、= "" だけでは不十分な場合があります。半角スペースが1つ入っているセルは = "" では「入力あり」と見なされてしまいます。状況に応じて TrimIsEmptyLen を使い分けることで、判定の精度が大きく変わります。

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

  • 「= “”」だけでは拾えないケースとその原因
  • 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= “”
完全に空(初期状態)TrueTrue
空文字列を手入力(Delete後に””を入力)FalseTrue
空文字列を返す数式(=””)FalseTrue
半角スペースのみFalseFalse
文字列が入っているFalseFalse

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(...) = ""
  • 全角スペースも除去したいなら ReplaceTrim を組み合わせる
  • 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 を入れておきましょう。

コメントする

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

上部へスクロール