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



