For文 VBAテクニック集 VBA一覧 文法・構文

【VBA】for next で複数条件の処理方法(For Next×If)

Excel VBAでデータ処理を行っていると、
「特定の条件に合うデータだけ処理したい」
「複数の条件を満たす行だけを対象にしたい」
「空白やエラーを除外して処理したい」
といった場面は非常に多くあります。

しかし、For Next と If を組み合わせた処理は便利である一方で、
条件が増えるほどコードが複雑になり、
後から修正しにくくなることも少なくありません。
特に実務では、条件が1つではなく、
2つ、3つと増えていくことがほとんどです。

そこで重要になるのが、
「複数条件を安全に管理できるFor Nextの書き方」
です。

この記事では、
For Next と If を組み合わせて複数条件を処理する方法を、
単なる文法説明ではなく、
実務で壊れにくく、保守しやすい設計という視点で解説していきます。

✅ VBAでFor NextとIfを組み合わせて複数条件を処理する基本的な考え方

For Next と If を組み合わせた処理は、
VBAの中でも最も頻繁に使われる構造の1つです。
しかし、条件を追加するたびにIf文を増やしていくと、
コードの見通しが悪くなり、
後から修正するときにミスが発生しやすくなります。
特に複数人でファイルを共有している場合、
意図が分からない条件分岐は大きなトラブルの原因になります。
また、条件の順番によって結果が変わるケースもあります。
そのため、単に動くコードを書くのではなく、
「なぜその条件を書くのか」を明確にすることが重要です。
ここではまず、基本的な考え方から整理していきましょう。

・For NextとIfを組み合わせる基本構造の例

まずは最も基本的な構造を確認します。


Sub ProcessData()

    Dim rowIndex As Long
    Dim lastRow As Long
    
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    
    For rowIndex = 2 To lastRow
        
        If Cells(rowIndex, 1).Value = "完了" Then
            
            Cells(rowIndex, 3).Value = "処理済"
            
        End If
        
    Next rowIndex

End Sub

このコードは、
「ステータスが完了の行だけ処理する」
という非常に典型的なパターンです。

重要なのは、
Forは対象範囲を決める役割
Ifは対象を絞り込む役割
という役割分担です。


✅ VBAで複数条件(AND)を使って安全に処理対象を限定する方法

実務では、
1つの条件だけで処理を判断することはほとんどありません。
例えば、
「ステータスが完了」
かつ
「金額が0より大きい」
といったように、
複数の条件を同時に満たす必要があります。
ここで条件の書き方を誤ると、
本来処理すべきデータが処理されなかったり、
逆に不要なデータまで処理されてしまうことがあります。
特に金額や数量などの数値条件は、
業務結果に直接影響するため注意が必要です。
この章では、安全に複数条件を扱う方法を解説します。

・AND条件を使った複数条件処理の実務例


Sub ProcessCompletedOrders()

    Dim rowIndex As Long
    Dim lastRow As Long
    
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    
    For rowIndex = 2 To lastRow
        
        If Cells(rowIndex, 1).Value = "完了" _
        And Cells(rowIndex, 2).Value > 0 Then
            
            Cells(rowIndex, 4).Value = "出荷対象"
            
        End If
        
    Next rowIndex

End Sub

このコードでは、
次の2つの条件を同時に満たす場合だけ処理します。

  • ステータスが「完了」
  • 数量が0より大きい

このように、
業務ルールをそのまま条件として表現する
ことが重要です。

複数条件を扱う際は、単にANDやORを追加するだけでなく、「どの条件をどの順番で評価するか」という設計が重要になります。ANDとORを組み合わせた複雑な条件を安全に管理したい場合は、【VBA】IF文のandとorを組み合わせた複数条件|実務で迷わない条件設計 もあわせて確認してみてください。


✅ VBAで複数条件(OR)を使って対象範囲を柔軟に広げる方法

一方で、
複数の条件のどれかを満たせば処理したい場合もあります。
例えば、
「未対応」または「保留」
といったステータスをまとめて処理したい場合です。
このような場面ではOR条件を使用します。
しかし、OR条件が増えるほど、
コードの可読性が低下する傾向があります。
特に条件が5つ以上になると、
後から見たときに理解しづらくなることがあります。
そのため、条件の数が増えた場合は、
別の設計を検討することも重要です。

・OR条件を使った実務的な処理例


Sub ProcessPendingData()

    Dim rowIndex As Long
    Dim lastRow As Long
    
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    
    For rowIndex = 2 To lastRow
        
        If Cells(rowIndex, 1).Value = "未対応" _
        Or Cells(rowIndex, 1).Value = "保留" Then
            
            Cells(rowIndex, 3).Value = "要確認"
            
        End If
        
    Next rowIndex

End Sub

このような処理は、
問い合わせ管理やタスク管理などでよく使用されます。

OR条件が2つまでは問題なくても、3つ以上になるとコードの見通しが急に悪くなり、思わぬ判定ミスが発生することがあります。OR条件が増えた場合でも安全に管理できる設計については、【VBA】IF文のORを3つ以上組み合わせた複数条件|実務で崩れない条件分岐の設計方法 もあわせて確認してみてください。


✅ VBAで複数条件を扱うときに最も重要な「スキップ処理」の考え方

複数条件を扱う際に最も重要なのは、
「処理しない条件」を明確にすることです。
多くのトラブルは、
処理対象を増やしすぎたことではなく、
除外条件を考慮しなかったことによって発生します。
例えば、
空白行やエラー値を処理してしまうと、
思わぬ結果につながることがあります。
このような問題を防ぐためには、
早い段階で不要なデータをスキップする設計が重要です。
この考え方は、
処理速度の改善にもつながります。

・空白やエラーをスキップする実務例


Sub SkipInvalidData()

    Dim rowIndex As Long
    Dim lastRow As Long
    
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    
    For rowIndex = 2 To lastRow
        
        If Cells(rowIndex, 1).Value = "" Then
            GoTo NextRow
        End If
        
        If IsError(Cells(rowIndex, 2).Value) Then
            GoTo NextRow
        End If
        
        Cells(rowIndex, 3).Value = "処理対象"
        
NextRow:
        
    Next rowIndex

End Sub

このように、
先に除外条件を書く
ことで、
処理の安全性が大きく向上します。

スキップ処理の考え方を理解したうえで、具体的に「空白セルをどのように安全にスキップするか」を実装として確認しておくことも重要です。実務で最も頻繁に発生する空白データへの対応方法については、【VBA】IF文で空白なら次の処理をさせる方法|スキップ処理と安全な条件分岐を実務目線で解説 もあわせて確認してみてください。


✅ VBAで複数条件を管理しやすくするための設計(可読性と保守性)

複数条件の処理は、
動けば良いという考え方では長続きしません。
実務では、
半年後や1年後に条件が変更されることがよくあります。
そのときにコードが読みにくいと、
修正に時間がかかり、
新たなバグを生む可能性があります。
そのため、
条件を分かりやすく整理する設計が重要です。
特に変数名やコメントは、
未来の自分や他の担当者へのメッセージになります。
ここでは、保守性を高めるための基本的な考え方を紹介します。

・条件を変数で管理する実務設計の例


Sub ProcessWithReadableConditions()

    Dim rowIndex As Long
    Dim lastRow As Long
    
    Dim isCompleted As Boolean
    Dim hasQuantity As Boolean
    
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    
    For rowIndex = 2 To lastRow
        
        isCompleted = (Cells(rowIndex, 1).Value = "完了")
        hasQuantity = (Cells(rowIndex, 2).Value > 0)
        
        If isCompleted And hasQuantity Then
            
            Cells(rowIndex, 4).Value = "出荷対象"
            
        End If
        
    Next rowIndex

End Sub

このように、
条件を変数として名前を付けることで、
コードの意味が明確になります。

特に重要なのは、
条件に意味のある名前を付けること
です。


✅ VBAで複数条件処理を関数化して再利用する設計の考え方

同じ条件判定を複数の場所で使う場合は、
関数として切り出すことで再利用しやすくなります。
これは単なる効率化ではなく、
バグを減らすための重要な設計手法です。
条件が1か所にまとまっていれば、
仕様変更にも簡単に対応できます。
逆に同じ条件が複数の場所に書かれていると、
修正漏れが発生しやすくなります。
特に長期間運用する業務では、
この差が大きくなります。
ここでは、実務で使える関数化の考え方を紹介します。

・条件判定をFunctionに切り出す実務例


Function IsProcessTarget(statusValue As String, quantityValue As Double) As Boolean

    If statusValue = "完了" _
    And quantityValue > 0 Then
        
        IsProcessTarget = True
        
    Else
        
        IsProcessTarget = False
        
    End If

End Function

Sub ProcessUsingFunction()

    Dim rowIndex As Long
    Dim lastRow As Long
    
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    
    For rowIndex = 2 To lastRow
        
        If IsProcessTarget( _
            Cells(rowIndex, 1).Value, _
            Cells(rowIndex, 2).Value) Then
            
            Cells(rowIndex, 4).Value = "出荷対象"
            
        End If
        
    Next rowIndex

End Sub

この設計の最大のメリットは、
条件の定義を1か所に集約できる
ことです。

条件判定を関数として切り出した場合は、「結果をどのような値として返すか」という戻り値の設計が非常に重要になります。Functionを使った処理をより整理しやすくするための考え方については、【VBA】プロシージャの戻り値の活用方法|Function設計で処理を整理する もあわせて確認してみてください。


 

✅ まとめ:For NextとIfで複数条件を安全に扱うための実務ポイント

  • Forは対象範囲、Ifは対象の絞り込みを担当する
  • AND条件は処理対象を正確に限定できる
  • OR条件は柔軟な判定に適している
  • 不要なデータは早い段階でスキップする
  • 条件には意味のある名前を付ける
  • 複雑な条件は関数化して管理する
  • 保守性を意識した設計が長期運用を支える

For Next と If を組み合わせた処理は、
VBAの中でも最も基本的でありながら、
最も実務に直結する技術です。

単に動くコードを書くのではなく、
将来の変更に耐えられる設計
を意識することで、
安定した業務システムを作ることができます。

    -For文, VBAテクニック集, VBA一覧, 文法・構文