VBAで自動化 VBA一覧 データ整形・分割 空白:削除

【VBA】IF文で空白なら次の処理をさせる方法|スキップ処理と安全な条件分岐を実務目線で解説

VBAでデータ処理を自動化していると、必ずと言っていいほど出てくるのが「空白セルをどう扱うか」という問題です。
たとえば、入力されていないセルは処理しないようにしたい、空白なら次の行へ進みたい、逆に空白があったら処理を止めたい、といった場面は非常に多くあります。

特に実務では、見た目は空欄でも実際にはスペースが入っていたり、数式の結果として空文字になっていたりして、単純に「何も入っていない」とは言えないケースも少なくありません。
そのため、「空白なら次の処理へ進む」という一見シンプルな制御でも、書き方を誤ると集計漏れや転記ミス、条件分岐の不具合につながります。

この記事では、VBAのIF文を使って空白を判定し、次の処理へ進める方法を、基本から実務向けの考え方まで丁寧に解説します。
単に動くコードを載せるだけではなく、「なぜその書き方にするのか」「どんな空白に注意すべきか」「どの設計にすると後から壊れにくいか」まで踏み込みます。

空白判定は、地味ですがマクロの品質を左右する重要ポイントです。
ここを曖昧にせずに整理しておくと、今後のVBA開発全体がかなり安定しやすくなります。

目次

✅ VBA IF文で空白なら次の処理をさせる基本的な考え方

「空白なら次の処理へ進む」と聞くと、単純に If セル = "" Then と書けばよいと思いがちです。ですが実務では、この認識だけで進めるとかなり危険です。なぜなら、VBAが判定する「空白」と、ユーザーが画面上で見ている「空欄」は、必ずしも一致しないからです。特に、スペースが混じっているセル、数式で空文字を返しているセル、エラー値を含むセルでは、想定通りに判定されないことがあります。ここを理解せずに条件分岐を組むと、「処理されたはずの行が飛ばされた」「本来無視すべき行が処理された」といった不具合が起こります。空白判定はVBAの入口のような処理ですが、ここを雑に書くと後続処理の信頼性が大きく下がります。最初に考えるべきなのは、何をもって“空白”とみなすのかを明確にすることです。

・VBAで「空白なら処理しない」とはどういう意味か

VBAで空白判定を書く場面では、多くの場合、次のような目的があります。

  1. 入力されていない行をスキップしたい
  2. 必須項目が空白なら処理を止めたい
  3. 空白セルには転記や計算を行いたくない
  4. データがある行だけを対象にループしたい

たとえば、A列に商品コードが入っている行だけ処理したい場合、A列が空白ならその行は飛ばしたいことがあります。
このような処理は、次のようなイメージです。

If Cells(rowIndex, 1).Value = "" Then
    ' 空白なら何もしない
Else
    ' 値があるときだけ処理する
End If

この書き方自体は間違いではありません。
ただし、これだけで十分かどうかは、扱うデータ次第です。

・「次の処理へ進む」の意味を先に整理する

「次の処理へ進む」といっても、実際には意味が複数あります。
ここを曖昧にすると、コードの意図が読み取りづらくなります。

  1. 同じプロシージャ内で後続の処理へ進む
  2. ループ中なら次の行へ進む
  3. 条件を満たさない場合だけ処理をスキップする
  4. 場合によっては Exit Sub などで全体を抜ける

つまり、「空白なら次の処理」とは、単なる日本語表現ではなく、
どの単位で処理を飛ばすのか を明確にする必要があります。

たとえばFor文の中であれば、「次の処理へ進む」は実質的に「この回の処理はスキップして次の行へ移る」を意味することが多いです。
その場合は、条件を早めに判定して、必要な処理だけを内側に書く方が読みやすくなります。

・まず覚えておきたい基本コード

もっとも基本的な書き方は次のとおりです。

Sub SkipIfBlankBasic()

    Dim rowIndex As Long
    
    For rowIndex = 2 To 10
        If Cells(rowIndex, 1).Value <> "" Then
            Cells(rowIndex, 2).Value = "処理対象"
        End If
    Next rowIndex

End Sub

このコードでは、A列に値が入っているときだけ、B列に「処理対象」と表示します。
A列が空白なら、何もせずに次のループへ進みます。

この書き方のよい点は、余計な分岐が少なく、読み手が意図を把握しやすいことです。
一方で、スペースのみが入っている場合や、数式の "" が入っている場合の扱いは別途考える必要があります。

✅ VBA IF文で空白判定を行う基本コードと実装手順

空白判定の基本は簡単に見えますが、実務で使うコードは「再利用しやすさ」と「誤判定を減らすこと」を重視すべきです。とりあえず If cell = "" Then と書いて動いたとしても、そのコードが別のシートや別の担当者の入力データでも同じように安全に動くとは限りません。特に業務ファイルでは、人によって入力のクセが違い、見えないスペースやコピー元由来の不要文字が混ざることがあります。ここで大事なのは、最初に“動作確認用の簡単なコード”と“実務投入向けのコード”を分けて考えることです。最初から複雑にしすぎる必要はありませんが、どこで強化が必要になるかを把握しておくことは重要です。ここではまず、基本形として使いやすいコードを押さえたうえで、実際の実装手順を整理していきます。

・空白セルをスキップする基本コードの実装手順

まずは、A列が空白ならその行の処理を飛ばす基本コードです。

Sub SkipBlankRows()

    Dim lastRow As Long
    Dim rowIndex As Long
    Dim targetValue As String
    
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    
    For rowIndex = 2 To lastRow
        targetValue = Cells(rowIndex, 1).Value
        
        If targetValue <> "" Then
            Cells(rowIndex, 2).Value = "処理済み"
        End If
    Next rowIndex

End Sub

このコードの実装手順は次のとおりです。

  1. lastRow でA列の最終行を取得する
  2. 2行目から最終行までループする
  3. A列の値を変数 targetValue に格納する
  4. targetValue が空白でない場合だけ処理する
  5. 空白なら何もせず次の行へ進む

この構成にしている理由は、Cells(rowIndex, 1).Value を何度も直接書かず、
一度変数に入れることで読みやすくし、あとで判定条件を増やしやすくするためです。

・なぜ直接Cellsを書き続けないのか

次のように直接書くこともできます。

If Cells(rowIndex, 1).Value <> "" Then
    Cells(rowIndex, 2).Value = "処理済み"
End If

もちろん、この書き方も悪くありません。
ただし実務では、後から条件が増えることが多いです。

たとえば、

  • 空白でない
  • スペースだけでもない
  • 特定の文字列でもない
  • 数値だけ処理したい

といった条件が増えると、直接参照を何度も書くコードは読みにくくなります。
そのため、最初から意味のある変数名に受けておくと、保守性が上がります。

・空白ならスキップ、値があれば処理する構造にする

実務でおすすめなのは、
「処理しない条件を書く」より「処理してよい条件を書く」 形です。

たとえば次のような構造です。

Sub ProcessOnlyWhenValueExists()

    Dim rowIndex As Long
    Dim lastRow As Long
    Dim customerName As String
    
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    
    For rowIndex = 2 To lastRow
        customerName = Cells(rowIndex, 1).Value
        
        If customerName <> "" Then
            Cells(rowIndex, 2).Value = customerName & " 様"
        End If
    Next rowIndex

End Sub

この書き方のメリットは、「値がある場合だけ処理対象になる」というルールが明快なことです。
逆に、空白時の分岐に多くを書いてしまうと、本来の主処理が見えにくくなります。

・実務で使うときの注意点

基本コードをそのまま使うときに注意したいのは次の点です。

  1. セルにスペースだけ入っている場合は空白扱いにならない
  2. 数式で "" を返しているセルの扱いを確認する必要がある
  3. 最終行取得の列は、実際の基準列に合わせる必要がある
  4. 判定対象が .Text なのか .Value なのかを意識する必要がある

この時点では、まず「普通の空白」を扱う基本形として覚えれば十分です。
そのうえで次の章から、実務で頻出する“見た目は空白なのに空白ではないケース”を整理します。

✅ VBAで空白判定するときに注意したいスペースと空文字の違い

空白判定のトラブルは、セルが本当に何も入っていない場合よりも、「見た目は空白なのに実際は空白ではない」場合に起きます。ここを理解せずにマクロを作ると、ユーザーから見ると空欄のはずのデータが処理対象になってしまい、意図しない転記や集計が発生します。特に、他システムから貼り付けられたデータや、関数で整形されたシートでは、空文字や半角スペースが混ざることが珍しくありません。見た目だけで判断していると、VBA側の条件分岐とのズレが大きくなります。この章を読まずに空白判定を作ると、「なぜこの行だけ処理されたのか分からない」という状態に陥りやすくなります。実務で安定した判定を書くには、空白・空文字・スペースの違いを整理しておくことが不可欠です。

・空白セルと空文字は同じではない

Excelでは、見た目が空欄でも中身の状態が異なることがあります。

代表的には次の3パターンがあります。

  1. 本当に何も入っていないセル
  2. 数式の結果として "" を返しているセル
  3. スペースだけが入っているセル

たとえば、次のような数式があるとします。

"=IF(A2="","",A2)"

この場合、表示上は空欄に見えても、セルには数式が入っています。
このようなケースでは、目的によって「空白として扱うかどうか」を決める必要があります。

・スペースだけ入っているセルは要注意

次のようなコードでは、スペースだけ入っているセルは空白と判定されません。

If Cells(rowIndex, 1).Value = "" Then
    ' 空白
End If

たとえばA列に " " のような半角スペースが1つ入っていた場合、
"" ではないため、空白ではないと判断されます。

この問題を防ぎたい場合は、Trim 関数を使うのが定番です。

If Trim(Cells(rowIndex, 1).Value) = "" Then
    ' 空白またはスペースのみ
End If

Trim を使うことで、前後の半角スペースを除去したうえで判定できます。
これにより、「見た目は空白なのに処理される」というトラブルを減らせます。

・実務でおすすめの空白判定コード

実務で扱いやすい基本形は次のようなものです。

Sub SkipBlankAndSpaceRows()

    Dim rowIndex As Long
    Dim lastRow As Long
    Dim inputText As String
    
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    
    For rowIndex = 2 To lastRow
        inputText = Trim(Cells(rowIndex, 1).Value)
        
        If inputText <> "" Then
            Cells(rowIndex, 2).Value = "有効データ"
        End If
    Next rowIndex

End Sub

このコードの設計意図は明確です。
単に値があるかを見るのではなく、
実務上意味のある入力があるか を判定しています。

ここで Trim を入れている理由は、あとから「空白セルなのに処理された」という問い合わせを減らすためです。
とくに複数人で入力する運用では、この配慮が大きな差になります。

・全角スペースもあるなら追加対策が必要

Trim で消せるのは、基本的に半角スペースです。
全角スペースが混ざる可能性がある場合は、Replace も組み合わせます。

Sub SkipRowsWhenOnlySpacesExist()

    Dim rowIndex As Long
    Dim lastRow As Long
    Dim normalizedText As String
    
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    
    For rowIndex = 2 To lastRow
        normalizedText = Cells(rowIndex, 1).Value
        normalizedText = Replace(normalizedText, " ", "")
        normalizedText = Trim(normalizedText)
        
        If normalizedText <> "" Then
            Cells(rowIndex, 2).Value = "処理対象"
        End If
    Next rowIndex

End Sub

このように書くと、全角スペースしか入っていないセルもスキップしやすくなります。
業務データでは、コピペ元がWebや他システムであることも多いため、この対策はかなり実用的です。

✅ VBA IF文で空白なら次の行へ進むループ処理の実務パターン

ループ処理の中で空白判定をどう書くかは、VBAの可読性を大きく左右します。初心者のうちは、If文の中に主処理をどんどん入れてしまいがちですが、条件が増えるほどネストが深くなり、コードが読みにくくなります。特に「空白ならスキップ」「値があれば処理」「条件に合わなければ別処理」といった分岐が増えると、少し修正しただけで思わぬ不具合が起きやすくなります。ここで大切なのは、ループ処理では“不要な行を早めに除外する”という考え方を持つことです。この設計を理解しておくと、空白判定は単なる条件式ではなく、全体の流れを整理するための入口になります。後から自分で読み返しても分かりやすく、他人に引き継ぎやすいコードにするためにも、この章の考え方は重要です。

・ループ内では「対象行だけ処理する」構造が読みやすい

たとえば、A列が空白でない行だけ処理するなら、次のような形が基本になります。

Sub ProcessRowsWithValueOnly()

    Dim rowIndex As Long
    Dim lastRow As Long
    Dim orderCode As String
    
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    
    For rowIndex = 2 To lastRow
        orderCode = Trim(Cells(rowIndex, 1).Value)
        
        If orderCode <> "" Then
            Cells(rowIndex, 2).Value = "確認済み"
            Cells(rowIndex, 3).Value = Now
        End If
    Next rowIndex

End Sub

この書き方では、空白行については何もせず自然に次のループへ進みます。
非常にシンプルで、処理対象の条件も分かりやすいです。

・空白時の処理を先に書きすぎない方がよい理由

次のような書き方もできます。

If orderCode = "" Then
    ' 何もしない
Else
    Cells(rowIndex, 2).Value = "確認済み"
    Cells(rowIndex, 3).Value = Now
End If

これでも動きますが、実務ではおすすめしにくいことがあります。
理由は、Then 側に「何もしない」が来ると、主処理が Else に追いやられ、
コードを追うときに読みづらくなるからです。

条件分岐が増えたときも、主処理が埋もれやすくなります。
そのため、基本的には 「処理する条件をIfで書く」 方が見通しがよくなります。

・複数条件と組み合わせる実務例

空白判定は、ほかの条件と組み合わせて使うことが多いです。
たとえば「A列が空白ではなく、B列が未処理なら処理する」といったケースです。

Sub ProcessWhenNotBlankAndNotDone()

    Dim rowIndex As Long
    Dim lastRow As Long
    Dim itemName As String
    Dim processStatus As String
    
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    
    For rowIndex = 2 To lastRow
        itemName = Trim(Cells(rowIndex, 1).Value)
        processStatus = Trim(Cells(rowIndex, 2).Value)
        
        If itemName <> "" And processStatus = "" Then
            Cells(rowIndex, 2).Value = "処理済み"
        End If
    Next rowIndex

End Sub

この構成なら、入力があり、かつ未処理の行だけを対象にできます。
実務ではこのように、空白判定は単独ではなく、処理状態の管理と組み合わせることが多いです。

・なぜこの書き方が保守しやすいのか

このコードのメリットは、条件の意味がそのまま読めることです。

  • itemName <> "" → 入力がある
  • processStatus = "" → 未処理である

つまり、条件分岐が業務ルールに直結しています。
あとから「未承認だけ対象にしたい」「エラー行は除外したい」といった条件が増えても、追加しやすい構造です。

逆に、ループの中で GoTo や複雑なネストを多用すると、
どの条件で何を飛ばしているのかが分かりにくくなります。
空白判定はシンプルに見えて、コード設計の質が出やすい部分です。

空白判定だけでなく、未処理・特定ステータス・対象区分など、複数の条件を組み合わせて実務向けに分岐したい場合は、【VBA】IF文のandとorを組み合わせた複数条件|実務で迷わない条件設計もあわせてご覧ください。

✅ VBAで空白なら次の処理をさせるときのおすすめコード設計

空白判定は単純な条件式として書くこともできますが、実務では「どこで判定するか」「どこまでを共通化するか」を意識すると、コードの品質が大きく変わります。最初は1つのマクロだけで使うつもりでも、後から似たような処理を別シートや別ブックにも流用したくなることは珍しくありません。そのとき、毎回 TrimReplace を各所にベタ書きしていると、修正漏れや条件の不統一が起こりやすくなります。特に空白判定は業務ルールの入口になりやすいため、判定の基準がマクロごとにズレると、同じファイル内でも動作が揃わなくなります。ここでは、ただ動かすだけでなく、後から変更しやすいコード設計としてどう書くべきかを整理します。実務で長く使うマクロほど、この発想が効いてきます。

・空白判定を関数化する考え方

同じ空白判定を何度も使うなら、関数に切り出すと保守しやすくなります。

Function IsBlankText(ByVal targetValue As String) As Boolean

    Dim normalizedText As String
    
    normalizedText = Replace(targetValue, " ", "")
    normalizedText = Trim(normalizedText)
    
    IsBlankText = (normalizedText = "")

End Function

この関数は、次のような意図で設計しています。

  • 半角スペースだけでなく全角スペースも除去する
  • 空白判定の基準を1か所にまとめる
  • メイン処理側を読みやすくする

このように関数化すると、メインのループ処理がかなり読みやすくなります。

・関数化した場合の実務コード例

Sub ProcessUsingBlankCheckFunction()

    Dim rowIndex As Long
    Dim lastRow As Long
    Dim productName As String
    
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    
    For rowIndex = 2 To lastRow
        productName = Cells(rowIndex, 1).Value
        
        If Not IsBlankText(productName) Then
            Cells(rowIndex, 2).Value = "登録対象"
        End If
    Next rowIndex

End Sub

Function IsBlankText(ByVal targetValue As String) As Boolean

    Dim normalizedText As String
    
    normalizedText = Replace(targetValue, " ", "")
    normalizedText = Trim(normalizedText)
    
    IsBlankText = (normalizedText = "")

End Function

・なぜこの書き方にしているのか

この書き方の最大のメリットは、
判定ロジックと業務処理を分離できること です。

メイン処理では「空白かどうか」ではなく、
「この行を処理してよいか」を読める状態になります。

つまり、コードを読んだときに、

  • IsBlankText(productName) → 空白判定ロジック
  • Cells(rowIndex, 2).Value = "登録対象" → 業務処理

と役割が分かれます。
これが保守性の高さにつながります。

・別の書き方とのメリット差

もちろん、毎回 Trim(Replace(...)) を直接書く方法でも動きます。
ただし、その場合は次の問題が出やすいです。

  1. 同じ判定式を何か所にも書くことになる
  2. 一部だけ条件が微妙に違う状態になりやすい
  3. 修正時に全か所見直す必要がある
  4. メイン処理の見通しが悪くなる

一方、関数化しておけば、
「全角スペースだけでなく改行も除去したい」となった場合も、
関数の中だけ直せば全体に反映できます。

・実務で使うときの注意点

関数化は便利ですが、何でもかんでも分ければいいわけではありません。
空白判定が1回しか出てこないような短いマクロなら、むしろ直接書いた方が分かりやすいこともあります。

大切なのは、

  • 同じ判定を複数回使うか
  • 今後条件が増えそうか
  • 他の人が見ても意図が分かるか

という観点で判断することです。

VBAは小さなマクロから始まりやすいですが、
業務で使われ続けるコードは後から肥大化しやすいです。
そのため、入口の判定処理だけでも設計を揃えておくと、後でかなり楽になります。

 

✅ VBA IF文で空白判定がうまくいかない原因と対処法

空白判定のコードを書いたのに期待通りに動かない場合、多くはIF文の文法ミスではなく、データの状態を正しく想定できていないことが原因です。特に実務では、画面上は空欄でも内部的には値が残っていたり、参照元のデータ形式が不統一だったりします。その結果、「空白ならスキップするはずなのに処理された」「入力されているのに空白扱いされた」といった混乱が起きます。こうした不具合は、コードを大幅に書き直さなくても、原因を切り分ければ解決できることが多いです。むしろ危険なのは、症状だけを見て場当たり的に条件を足し続けることです。そうすると、判定ロジックがどんどん分かりにくくなり、別の不具合を呼び込みます。ここでは、よくある原因とその対処法を、実務で遭遇しやすい順に整理します。

・原因1:見えないスペースが入っている

もっとも多い原因の1つが、スペースだけが入っているケースです。
特に他人が入力したファイルや、外部システムから貼り付けたデータでは起こりやすいです。

対処法は、判定前に Trim を使うことです。

If Trim(Cells(rowIndex, 1).Value) = "" Then
    ' 空白扱い
End If

全角スペースも想定されるなら、Replace も併用します。

Dim checkText As String

checkText = Cells(rowIndex, 1).Value
checkText = Replace(checkText, " ", "")
checkText = Trim(checkText)

If checkText = "" Then
    ' 空白扱い
End If

・原因2:数式で空文字を返している

セルに数式が入っていて、結果として "" が表示されている場合があります。
これ自体は空欄に見えるため、仕様として空白扱いにしたいなら問題ありません。

ただし、「本当に未入力なのか」「数式が入っているのか」を区別したい場合は、
単純な .Value = "" では足りません。

たとえば次のように確認できます。

If Cells(rowIndex, 1).HasFormula Then
    ' 数式が入っている
End If

この判定を組み合わせることで、
「未入力セル」と「空文字を返す数式セル」を分けて扱えます。

・原因3:対象列の最終行取得がずれている

空白判定そのものではなく、ループ範囲の取得が原因のこともあります。
たとえばA列で最終行を取っているのに、実際の判定対象はC列だった場合、
意図しない行までループしてしまうことがあります。

lastRow = Cells(Rows.Count, 3).End(xlUp).Row

このように、最終行取得の基準列は、
その処理においてもっとも信頼できる列 に合わせる必要があります。

・原因4:Nullやエラー値を想定していない

通常のセルでは少ないですが、外部データやオブジェクト経由の値では、
Null やエラー値が混ざることもあります。
このような場合、単純に Trim をかけるとエラーになることがあります。

そのため、より厳密に書くなら、事前に IsErrorIsNull を確認することもあります。
ただし、通常のシート処理でここまで必要になるケースは多くありません。
まずはスペース・空文字・最終行のズレを疑う方が実務的です。

・まず確認したい切り分け方法

判定がうまくいかないときは、いきなり条件を増やすのではなく、
対象セルの実際の中身を確認するのが先です。

Debug.Print "[" & Cells(rowIndex, 1).Value & "]"

このようにイミディエイトウィンドウへ出力すると、
スペースが入っているかどうかが見えやすくなります。

空白判定の不具合は、コードの問題というより
「データの中身を想定できていない」ことが多いです。
そのため、まず観察してから対処する癖をつけると、無駄な修正を減らせます。

✅ VBA IF文で空白なら次の処理をさせる実務向けサンプル

基本だけ理解しても、実際の業務でどう使うのかが見えないと、コードは定着しにくいものです。特に「空白なら次へ進む」という処理は、単独で使うよりも、転記・集計・チェック・メール作成前処理などの中で使われることがほとんどです。ここで具体例を見ておくと、自分の業務に置き換えやすくなります。また、サンプルコードはただ動けばよいのではなく、「何を基準に空白とみなしているか」「どこを変更すれば流用できるか」が分かる形で書くことが大切です。実務で役立つコードは、再利用しやすさが高く、読み手が意図を把握しやすいものです。この章では、空白行のスキップを実際の業務処理に近い形で使うサンプルを紹介します。

・サンプル1:氏名が空白なら転記しない

氏名欄が空白の行は、転記対象にしない例です。

Sub CopyOnlyRowsWithName()

    Dim sourceLastRow As Long
    Dim sourceRowIndex As Long
    Dim outputRowIndex As Long
    Dim customerName As String
    
    sourceLastRow = Cells(Rows.Count, 1).End(xlUp).Row
    outputRowIndex = 2
    
    For sourceRowIndex = 2 To sourceLastRow
        customerName = Cells(sourceRowIndex, 1).Value
        customerName = Replace(customerName, " ", "")
        customerName = Trim(customerName)
        
        If customerName <> "" Then
            Cells(outputRowIndex, 5).Value = Cells(sourceRowIndex, 1).Value
            Cells(outputRowIndex, 6).Value = Cells(sourceRowIndex, 2).Value
            outputRowIndex = outputRowIndex + 1
        End If
    Next sourceRowIndex

End Sub

この書き方にしている理由

このコードでは、判定用の氏名と実際に転記する元データを分けています。
つまり、空白判定は正規化した文字列で行い、実際の転記は元セルの値を使っています。

これは実務でよくある設計です。
判定のために値を整形しても、転記先では元の表記を保ちたいことがあるからです。

別案との違い

判定した後、そのまま customerName を転記する方法もあります。
ただし、その場合は全角スペースや前後の空白まで削除された状態で出力されます。
それが望ましいケースもありますが、氏名や正式名称では勝手に整形しない方が安全なこともあります。

・サンプル2:空白ならステータス更新をしない

入力がある行だけステータスを更新する例です。

Sub UpdateStatusWhenInputExists()

    Dim lastRow As Long
    Dim rowIndex As Long
    Dim inputCode As String
    
    lastRow = Cells(Rows.Count, 2).End(xlUp).Row
    
    For rowIndex = 2 To lastRow
        inputCode = Trim(Replace(Cells(rowIndex, 2).Value, " ", ""))
        
        If inputCode <> "" Then
            Cells(rowIndex, 4).Value = "確認済み"
            Cells(rowIndex, 5).Value = Date
        End If
    Next rowIndex

End Sub

実務での活用場面

このような処理は、たとえば次のような場面で使えます。

  1. 受注番号がある行だけ処理済みフラグを付ける
  2. 入力完了行だけ確認日を記録する
  3. 空白行への不要な更新を避ける

空白行まで一律で更新してしまうと、あとで「なぜこの行が処理済みなのか」が分からなくなります。
そのため、空白判定はステータス管理でも重要です。

空白セルを1行ずつ判定する方法に慣れてきたら、空白セルやエラーセルをまとめて検出して処理したい場面も増えてきます。そのような場合は、【VBA】特定のセル(空白セル・数式セル・エラーセル)を見つけ出す:SpecialCells メソッドもあわせて確認しておくと、処理速度と可読性を大きく改善できます。

✅ VBAで空白処理を安定させるために覚えておきたい実務判断

空白判定のコードそのものを覚えるだけでは、実務では不十分です。なぜなら、本当に重要なのは「どの状態を空白として扱うか」を業務ルールとして決めることだからです。たとえば、スペースだけの入力は無効にするのか、数式で空文字が返っているセルは入力済みとみなすのか、未入力はスキップでよいのかエラーにすべきなのか――こうした判断は、単なる文法ではなく設計の問題です。ここが曖昧なままマクロを作ると、動くけれど現場では使いにくい、という状態になりがちです。逆に、空白の定義を最初に決めておくと、条件分岐がすっきりし、問い合わせや仕様変更にも対応しやすくなります。最後に、このテーマを実務で使ううえで押さえておきたい判断軸を整理しておきます。

・「空白」の定義を業務目線で決める

まず大切なのは、技術的な空白判定より前に、
業務上どの状態を空白とみなすかを決めることです。

たとえば次のような違いがあります。

  1. 本当に未入力のセルだけ空白扱いする
  2. 半角スペース・全角スペースだけの入力も空白扱いする
  3. 数式の "" も空白扱いする
  4. 空白があれば処理を飛ばすのか、エラーにするのかを分ける

この整理がないと、コードだけ立派でも現場でズレが出ます。

・スキップでよいのか、警告すべきなのかを分ける

「空白なら次の処理へ進む」は便利ですが、すべてをスキップしてよいとは限りません。
たとえば任意入力欄ならスキップで問題ありませんが、
必須項目なら本来はメッセージ表示や処理停止が必要です。

つまり、空白判定では次の区別が重要です。

  • 空白でも問題ない項目
  • 空白だと困る項目
  • 空白なら対象外にすべき項目

この考え方がないと、
本来エラーとして気づくべきデータ不備を、ただ静かに飛ばしてしまいます。

・読みやすいコードは問い合わせを減らす

VBAは一度作って終わりではなく、
後から自分や他の人が直す可能性があります。
そのとき、空白判定がベタ書きだらけだと、どこを直せばよいか分かりにくくなります。

そのため、

  • 変数名を意味のある名前にする
  • 判定ロジックをまとめる
  • 主処理が見える構造にする

といった基本が効いてきます。

空白判定は小さな処理ですが、
コード全体の“読みやすさ”がそのまま出やすい部分です。

・ExcelVBAに少し踏み込むならここが発展ポイント

今回のような「空白なら次へ進む」処理は、VBAの条件分岐の基本です。
ただ、実務でマクロを安定させていくと、その先では

  • ElseIfで条件を段階的に分ける
  • Function化して判定処理を再利用する
  • Exit Subやエラー処理と組み合わせて安全性を上げる

といった設計も重要になります。

単発のマクロならシンプルに書くのが正解ですが、
同じような空白判定が増えてきたら、VBA全体の設計を見直すタイミングです。
この視点を持っておくと、「とりあえず動くコード」から一段進みやすくなります。

空白をどう扱うかは単なるコードの書き方ではなく、『どこまで自動化するか』『どの判断を人に残すか』という業務設計の問題でもあります。こうした視点を整理しておきたい場合は、Excel業務はどこまで改善すべきか?手作業を残していい業務の判断基準もあわせて確認しておくと、より実務に合った自動化を設計しやすくなります。

 

✅ まとめ:VBA IF文で空白なら次の処理をさせる方法を正しく使おう

  • VBAで空白なら次の処理へ進める基本は、If 値 <> "" Then の形で書ける
  • ただし実務では、スペースだけのセルや空文字を返す数式に注意が必要
  • 半角スペース対策には Trim、全角スペース対策には Replace の併用が有効
  • ループ処理では「処理する条件を書く」構造の方が読みやすく保守しやすい
  • 同じ空白判定を何度も使うなら、Function化すると再利用しやすい
  • 空白ならスキップでよいのか、警告すべきなのかは業務ルールで決めるべき
  • 空白判定は地味でも、マクロ全体の品質と信頼性に直結する重要ポイント

空白判定は、VBAの中では基本に見える処理ですが、実務ではとても重要です。
ここを丁寧に設計するだけで、転記漏れや誤処理をかなり減らせます。

「空白なら次へ進む」を何となく書いていた場合は、ぜひ今回の内容をもとに、
どの状態を空白として扱うのか を一度整理してみてください。
それだけでも、今後のVBAコードはかなり壊れにくく、読みやすくなります。

    -VBAで自動化, VBA一覧, データ整形・分割, 空白:削除