VBAのIfネストを浅くする方法|Exit Subで条件をふるい落とす書き方とAnd条件の使い分け

VBAのIfネスト(入れ子)が深くなったら、「条件を先にふるい落とす」か「And条件でまとめる」の2つで解消できます。どちらも数行の修正で対応でき、コードが読みやすく・直しやすくなります。

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

  • Ifネストが深いと何が問題なのか
  • ネストを浅くする2つの方法(条件を先にふるい落とす・And条件)
  • どちらを使うべきかの使い分け
  • ElseIfを使った多段階の条件分岐の整理
  • よくあるミスとFAQ

Ifネストが深いと何が問題なのか?

条件が増えるたびにIfを重ねていくと、次のようなコードになります。

Sub DeepNestExample()
    Dim age    As Long
    Dim gender As String
    Dim member As Boolean

    age    = 30
    gender = "M"
    member = True

    If age > 20 Then
        If gender = "M" Then
            If member = True Then
                MsgBox "条件をすべて満たしました"
            End If
        End If
    End If
End Sub

このコード自体は正しく動きますが、次のような問題が起きやすくなります。

  • どのEnd IfがどのIfに対応しているかわからない:ネストが深いほど対応関係が追いにくくなります。
  • 処理が増えると一気に読みにくくなる:実務では条件の中に複数行の処理が入ることが多く、全体像がつかみにくくなります。
  • デバッグに時間がかかる:どの条件で処理が止まったかを把握しにくくなります。
  • 修正しづらい:条件を1つ追加・削除するだけで、インデントの崩れや対応ミスが起きやすくなります。

ネストを浅くするには?(方法1:条件を先にふるい落とす)

「満たしていない条件を先にはじく」考え方です。条件を逆にして Exit Sub で処理を抜けることで、ネストをなくせます。「条件を満たさなければその場で終了する」という出口を先に作るイメージです。

Sub FlatIfExample()
    Dim age    As Long
    Dim gender As String
    Dim member As Boolean

    age    = 30
    gender = "M"
    member = True

    ' 満たさない条件を先に排除する
    If age <= 20 Then Exit Sub
    If gender <> "M" Then Exit Sub
    If member = False Then Exit Sub

    ' ここまで来たら全条件をクリアしている
    MsgBox "条件をすべて満たしました"
End Sub

ネストが深い元のコードと見比べると、スッキリした構造になっているのがわかります。

観点ネストが深い書き方条件を先にふるい落とす
コードの行数多くなりやすい少なくなる
条件の対応関係追いにくい1行ずつ明確
メインの処理の位置深い場所に埋まる一番下に集まる
条件の追加・変更インデントが崩れやすい1行追加するだけ

この方法が特に有効な場面:条件が3つ以上ある・条件ごとに処理内容が変わる・入力チェックや前提確認が必要なとき。

ネストを浅くするには?(方法2:Andで条件をまとめる)

すべての条件を同時に満たすときだけ処理したい場合は、And でつなげて1つのIfにまとめる方法が使えます。

Sub AndConditionExample()
    Dim age    As Long
    Dim gender As String
    Dim member As Boolean

    age    = 30
    gender = "M"
    member = True

    If age > 20 And gender = "M" And member = True Then
        MsgBox "条件をすべて満たしました"
    End If
End Sub

処理が1行だけの場合は、さらに省略して次のように書くこともできます。

' 処理が1行のときはEnd Ifを省略できる
If age > 20 And gender = "M" And member = True Then MsgBox "条件をすべて満たしました"

注意:条件が4つ以上になると1行が長くなりすぎて読みにくくなります。その場合は行継続文字(_)で折り返すか、「条件を先にふるい落とす」方法に切り替える方がおすすめです。

' 条件が多い場合は行継続文字で折り返す
If age > 20 And _
   gender = "M" And _
   member = True Then
    MsgBox "条件をすべて満たしました"
End If

2つの方法をどう使い分けるには?

「条件を先にふるい落とす」方法とAnd条件は、それぞれ得意な場面が違います。

状況おすすめの方法
条件ごとにエラーメッセージを出したい条件を先にふるい落とす
入力チェック・前提確認をしたい条件を先にふるい落とす
条件が2〜3つでシンプルにまとめたいAnd条件
条件をすべて満たしたときだけ処理したいAnd条件
条件が4つ以上で複雑条件を先にふるい落とす

次のコードは、条件ごとに異なるメッセージを出したい場合の例です。

Sub CheckWithMessage()
    Dim age    As Long
    Dim gender As String
    Dim member As Boolean

    age    = 18
    gender = "M"
    member = True

    ' 条件ごとにメッセージを出す
    If age <= 20 Then
        MsgBox "年齢条件を満たしていません"
        Exit Sub
    End If
    If gender <> "M" Then
        MsgBox "性別条件を満たしていません"
        Exit Sub
    End If
    If member = False Then
        MsgBox "会員条件を満たしていません"
        Exit Sub
    End If

    MsgBox "条件をすべて満たしました"
End Sub

ElseIfを使って多段階の条件を整理するには?

「AならX、BならY、それ以外はZ」という多段階の分岐は、IfをネストするよりElseIfでフラットに書く方がわかりやすくなります。

' ネストで書いた場合(読みにくい)
Sub NestedGrade()
    Dim score As Long
    score = 75

    If score >= 80 Then
        MsgBox "優"
    Else
        If score >= 60 Then
            MsgBox "良"
        Else
            If score >= 40 Then
                MsgBox "可"
            Else
                MsgBox "不可"
            End If
        End If
    End If
End Sub

' ElseIfで書いた場合(読みやすい)
Sub FlatGrade()
    Dim score As Long
    score = 75

    If score >= 80 Then
        MsgBox "優"
    ElseIf score >= 60 Then
        MsgBox "良"
    ElseIf score >= 40 Then
        MsgBox "可"
    Else
        MsgBox "不可"
    End If
End Sub

ElseIfは何段階でも追加できます。条件の数が多い場合でも、横へのネストが生まれないため、全体の流れが追いやすくなります。

まとめ

  • Ifのネストが深くなると、対応関係が追いにくく、修正しづらくなる。
  • 条件を先にふるい落とす(Exit Sub:満たさない条件を先にはじく。条件が多い・条件ごとにメッセージを出したい場合に有効。
  • And条件でまとめる:条件が2〜3つのシンプルな場合に向いている。
  • ElseIfを使う:多段階の分岐はElseIfでフラットに書くと読みやすい。
  • 実務では「後から見返してわかるコード」が重要。ネストを浅くするだけでコードの品質が大きく上がる。

FAQ

条件を先にふるい落とす方法とAndどちらを使えばいいですか?

条件ごとにエラーメッセージを出したい、または条件が4つ以上ある場合は「条件を先にふるい落とす」方法が向いています。条件が2〜3つでシンプルにまとめたい場合はAndが便利です。どちらが正解というわけではなく、読みやすさを優先して選びましょう。

Exit Subを使うと処理全体が止まりますか?

Exit SubはそのSubプロシージャ(マクロ)だけを終了します。他のSubから呼び出している場合は、呼び出し元の処理は続きます。マクロ全体を止めたい場合はEndを使いますが、通常はExit Subで十分です。

AndとOrの違いは何ですか?

Andはすべての条件を満たしたときにTrueになります。Orはどれか1つでも満たせばTrueになります。例えば「年齢が20以上、かつ会員」ならAnd、「年齢が20以上、または会員」ならOrを使います。

ネストは何段まで許容されますか?

VBAの仕様上は深いネストも動作しますが、実務では2段(多くても3段)を目安にしましょう。それ以上になるようなら「条件を先にふるい落とす」方法やElseIfへの書き換えを検討してください。コードを読む人(未来の自分も含む)が一目でわかる構造を意識することが大切です。

ElseIfとElse+Ifの違いは何ですか?

ElseIfは1つのIf文の中で複数の条件を並べるため、End Ifは最後に1つだけで済みます。Elseの中にIfを書くと新たなIf文が始まるため、それぞれにEnd Ifが必要になりネストが深くなります。多段階の分岐にはElseIfを使う方がすっきりします。


動画で学びたい方へ

「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。

VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。

動画で学ぶExcelマクロ|JIMOVEオンラインスクール

コメントする

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

上部へスクロール