【VBA】If文の使い方を完全解説|条件分岐の基本から複数条件まで(コピペOK)

【VBA】If文の使い方を完全解説|条件分岐の基本から複数条件までの解説用アイキャッチ画像 VBA

この記事でできること

VBAのコードをコピペして動かしている。便利だ。でもIf文の部分を自分の条件に書き換えようとすると、手が止まる。

「If…Then…Else」の構文は何となく読める。でも「3つ以上の分岐はどう書くの?」「AndとOrはどう組み合わせるの?」「If文の中にIf文を入れていいの?」——自分で条件を書けない。

If文が書けるようになれば、コードを自分の業務に合わせてカスタマイズできる。If文はVBAの全ての処理の土台だ。

この記事では、If文の基本から複数条件・ネストまで、段階的に全パターンを解説する。各パターンにコピペで動くコード例付き。

  • 対象:If文を自分で書けるようになりたい人
  • 所要時間:通読約15分。手を動かしながらなら30分

If文は「業務ルールをコードにする」場所

自分も、コピペしたマクロのIf条件だけ変えたい場面で何度も手が止まったことがある。文法そのものより、「この業務ルールをどの順番で判定すればいいのか」を整理できていないと、If文は急に難しく見える。

たとえば「10万円以上なら承認者を確認する」「在庫が0なら発注対象にする」「ステータスが完了なら一覧から除外する」といった判断は、すべてIf文で表現できる。つまりIf文は、業務で人が頭の中で行っている判断を、Excelに同じ順番で実行させるための書き方だ。

VBAのIf文で業務ルールをIf ElseIf Elseに変換して処理を分ける流れ
まず日本語で条件を書き出し、その条件をIf、ElseIf、Elseへ落とし込むと、実務の判断をコードにしやすくなります。

この記事では、単純な1条件から始めて、2択、3分岐、複数条件、ネスト、Select Caseの順に進める。今の業務で「人が判断しているところ」を思い浮かべながら読むと、コードの使いどころが見えやすい。

完成イメージ(Before / After)

Before(If文が書けない)

Before(実行前)のExcel画面
A B
1 状態 悩み
2 コピペはできる 条件を書き換えられない
3 If…Thenは読める ElseIfの書き方がわからない
4 AndとOrが不安 複数条件の組み合わせ方?

After(If文が書ける)

After(実行後)のExcel画面
A B
1 パターン 書ける
2 If…Then ✓ 1行で書ける
3 If…Then…Else ✓ 2択分岐
4 ElseIf ✓ 3つ以上の分岐
5 And / Or / Not ✓ 複数条件
6 ネスト ✓ Ifの中にIf

1. If…Then(最もシンプル)

条件を満たしたときだけ処理する。最も基本的な形。


Sub IfBasic()
    Dim score As Long
    score = Range("A1").Value

    If score >= 70 Then
        Range("B1").Value = "合格"
    End If
End Sub

ポイント:

  • If 条件 Then で始まり、End If で閉じる
  • 条件を満たさない場合は何もしない(スキップ)

1行で書く方法

処理が1つだけなら、1行で書ける。


If score >= 70 Then Range("B1").Value = "合格"

注意: 1行で書く場合は End If は不要。ただし処理が複数ある場合は使えない。迷ったら複数行で書く方が安全。

2. If…Then…Else(2択分岐)

条件を満たしたときと、満たさなかったときで処理を分ける。


Sub IfElse()
    Dim score As Long
    score = Range("A1").Value

    If score >= 70 Then
        Range("B1").Value = "合格"
    Else
        Range("B1").Value = "不合格"
    End If
End Sub

ポイント:

  • Else は「それ以外」の意味
  • 条件を満たす → Thenの下の処理
  • 条件を満たさない → Elseの下の処理
  • 必ずどちらかが実行される

実務例: 在庫の判定


Sub CheckStock()
    Dim stock As Long
    stock = Range("B2").Value

    If stock > 0 Then
        Range("C2").Value = "在庫あり"
    Else
        Range("C2").Value = "発注必要"
    End If
End Sub

3. If…ElseIf…Else(3つ以上の分岐)

条件が3つ以上に分かれる場合。If文で最もよく使うパターン。


Sub IfElseIf()
    Dim score As Long
    score = Range("A1").Value

    If score >= 90 Then
        Range("B1").Value = "優"
    ElseIf score >= 70 Then
        Range("B1").Value = "良"
    ElseIf score >= 50 Then
        Range("B1").Value = "可"
    Else
        Range("B1").Value = "不可"
    End If
End Sub

ポイント:

  • ElseIf はいくつでも追加できる
  • 上から順に判定される。最初に一致した条件の処理だけが実行される
  • Else は「どの条件にも当てはまらなかった場合」のセーフティネット
  • Else は省略可能だが、想定外の値に備えて書いておくのが安全

実務例: 検査データの判定


Sub InspectionJudge()
    Dim value As Double
    value = Range("C2").Value

    If value < 9.5 Then
        Range("D2").Value = "NG(下限割れ)"
    ElseIf value > 10.5 Then
        Range("D2").Value = "NG(上限超え)"
    Else
        Range("D2").Value = "OK"
    End If
End Sub

基準値9.5〜10.5の範囲内なら「OK」、範囲外なら理由付きで「NG」と判定する。

If文の使い分けを先に整理する

VBAのIf Then If Else ElseIf Select Case And Or Notの使い分け早見表
条件の数と読みやすさで、If…Then、If…Else、ElseIf、Select Case、And、Or、Notを使い分けます。

最初はIfだけで書き切ろうとしがちだが、条件が増えるほど読みやすさが大事になる。特に同じ値を何パターンにも分ける場合は、ElseIfを積み上げるよりSelect Caseのほうが後から直しやすい。

4. 複数条件(And / Or / Not)

1つの条件だけでなく、2つ以上の条件を組み合わせる

And(両方とも満たす)


If score >= 70 And attendance >= 80 Then
    Range("B1").Value = "合格"
End If

点数が70以上 かつ 出席率が80以上のとき合格。

Or(どちらかを満たす)


If department = "営業部" Or department = "企画部" Then
    Range("B1").Value = "対象"
End If

部署が営業部 または 企画部のとき対象。

Not(条件を反転する)


If Not IsEmpty(Range("A1")) Then
    ' A1が空でないとき
    Range("B1").Value = "入力済み"
End If

And と Or を組み合わせる


If (score >= 70 And attendance >= 80) Or exemption = True Then
    Range("B1").Value = "合格"
End If

カッコで優先順位を明示する。 カッコがないとAndが先に評価されるが、カッコを付けた方が読みやすく安全。

実務例: 承認フローの判定


Sub ApprovalCheck()
    Dim amount As Long
    Dim rank As String
    amount = Range("B2").Value
    rank = Range("C2").Value

    If amount >= 100000 And rank <> "部長" Then
        Range("D2").Value = "上長承認が必要"
    ElseIf amount >= 100000 And rank = "部長" Then
        Range("D2").Value = "承認不要(部長権限)"
    Else
        Range("D2").Value = "承認不要"
    End If
End Sub

5. ネスト(Ifの中にIf)

If文の中にさらにIf文を書く。条件が階層的に分かれるときに使う。


Sub NestedIf()
    Dim department As String
    Dim sales As Long
    department = Range("A2").Value
    sales = Range("B2").Value

    If department = "営業部" Then
        If sales >= 1000000 Then
            Range("C2").Value = "営業部・目標達成"
        Else
            Range("C2").Value = "営業部・目標未達"
        End If
    Else
        Range("C2").Value = "営業部以外"
    End If
End Sub

注意: ネストが3階層以上になると読みにくくなる。2階層までに留めるのが実務的。 3階層以上になる場合は、条件をAndで結合するか、Select Caseの使用を検討する。

6. Select Caseとの使い分け

If文と似た機能に Select Case がある。使い分けの基準は明確。

場面 使うべき構文 理由
2択分岐(○か×か) If…Else シンプルで読みやすい
数値の範囲で分岐(90以上、70以上…) If…ElseIf 範囲指定が柔軟
1つの値で3つ以上に分岐(A, B, C…) Select Case 値の列挙が見やすい
複数条件の組み合わせ(And/Or) If Select Caseでは複数変数の組み合わせが書けない

Select Caseの例


Sub SelectCaseExample()
    Dim grade As String
    grade = Range("A1").Value

    Select Case grade
        Case "A"
            Range("B1").Value = "優秀"
        Case "B"
            Range("B1").Value = "良好"
        Case "C"
            Range("B1").Value = "普通"
        Case Else
            Range("B1").Value = "要改善"
    End Select
End Sub

迷ったらIf文を使えばOK。 Select Caseは「1つの変数の値で分岐するとき」に使うと見やすくなる。

7. 実務で使えるコード例

一覧表の全行を判定して結果を書き込む


Sub JudgeAllRows()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("データ")

    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    Dim i As Long
    For i = 2 To lastRow
        Dim value As Double
        value = ws.Cells(i, 3).Value  ' C列の数値

        If value >= 10.5 Then
            ws.Cells(i, 4).Value = "NG(上限超え)"
        ElseIf value < 9.5 Then
            ws.Cells(i, 4).Value = "NG(下限割れ)"
        Else
            ws.Cells(i, 4).Value = "OK"
        End If
    Next i

    MsgBox "判定完了(" & lastRow - 1 & "件)", vbInformation
End Sub

書き換えポイント:

  • シート名「データ」を自分のシート名に変更
  • C列(3列目)を判定対象の列番号に変更
  • 基準値(9.5, 10.5)を自分の基準に変更
  • D列(4列目)を結果出力先に変更

よくある落とし穴6選

# 症状 原因 対策
1 ElseIfが実行されない 上の条件に先に一致している。If文は上から順に判定し、最初に一致した時点で残りはスキップ 条件の順序を確認。厳しい条件を上に書く
2 文字列の比較が一致しない 全角/半角、大文字/小文字の違い。"OK""ok" は別物 LCase()UCase() で統一してから比較
3 End If を書き忘れてエラー 複数行のIf文には必ず End If が必要 1行版を使わない限り、必ずEnd Ifで閉じる
4 ネストが深すぎてコードが読めない If文を3階層以上ネストしている 2階層までに留める。AndやSelect Caseで書き直す
5 === を間違える VBAでは比較演算子は =(イコール1つ)。== はエラーになる VBAは代入も比較も = を使う
6 数値と文字列を比較してしまう セルに "100" と文字列で入っていると >= 100 の比較が意図通りに動かない Val()CDbl() で数値に変換してから比較

VBAのIf文でElseIfが実行されないときの対処法

「ElseIfを書いたのにその分岐に入らない」という場合、原因は上のIfまたはElseIfの条件に先に一致していることだ。If文は上から順に評価し、最初に一致した分岐だけを実行する。例えば If score >= 50 Then の後に ElseIf score >= 70 Then と書くと、70点以上でも先に >= 50 に一致するため、ElseIfには到達しない。厳しい条件(大きい値)を上に書くのが鉄則。

VBAのIf文で文字列比較がうまくいかないときの対処法

「Ifで文字列を比較しているのに一致しない」という場合、原因は全角/半角・大文字/小文字の違いだ。"ABC""A B C"(全角)は別物。LCase() で小文字に統一してから比較するか、全角⇔半角を一括変換してデータを統一する方法 で事前にデータを統一しておくと安心。

実務でIf文を書く前に決めること

If文は、ただ条件を書くための文法ではなく、業務ルールをそのままコードに落とす場所です。現場では「空欄なら未処理」「金額が0なら確認」「期限を過ぎたら要対応」のように、人が毎回目で見て判断している作業をIf文に置き換えることが多いです。

ここであいまいな条件のまま書き始めると、あとから例外が増えてIf文が読みにくくなります。自分も最初のころは、動けばよいと思って条件を足し続け、あとからどの分岐が正しいのか追いにくくなったことがあります。先に判断表を作ってからコードにすると、同じ部署の人に説明するときもかなり楽になります。

判断することコードにする前の確認
空欄かどうか担当者が空なら未割当空白だけの入力も空欄扱いにするか
数値の範囲在庫が10未満なら発注候補境界値の10を含めるか
日付の期限期限日を過ぎたら遅延当日は遅延にするか
文字列の一致ステータスが完了なら対象外全角半角や前後スペースをどう扱うか

判断表をコードにする例

Dim statusText As String
statusText = Trim(Range("C2").Value)

If statusText = "" Then
    Range("D2").Value = "未入力"
ElseIf statusText = "完了" Then
    Range("D2").Value = "確認不要"
Else
    Range("D2").Value = "要確認"
End If

この例では、先に Trim で前後の空白を落としています。実務の表では、見た目では同じ「完了」でも、末尾にスペースが入っていて一致しないことがあります。If文が間違っているように見えて、実は入力値の揺れが原因というケースはよくあります。

また、If文を他の人に引き継ぐ可能性があるなら、条件の順番も大切です。例外条件を先に書き、最後に通常処理を書くと、あとから読んだ人が判断の流れを追いやすくなります。「空欄」「対象外」「異常値」のような止める条件を先に処理してから、通常の判定に入る形です。この書き方にしておくと、業務ルールが増えたときも、どこに条件を足せばよいか迷いにくくなります。

レビューしてもらう前には、条件を日本語で1行ずつ書き出し、現場の人に違和感がないか確認すると手戻りが減ります。この確認だけでも、コード修正の回数をかなり減らせます。

FAQ

Q1: If文とIIf関数はどう違う?

IIf(条件, 真の値, 偽の値) は1行で書けるが、真の値と偽の値の両方が常に評価される(短絡評価しない)。エラーが起きる式を含む場合は If を使う方が安全。

Q2: 条件が10個以上ある場合はどうする?

Select Case を使う。値の列挙が10個でも見やすく書ける。範囲指定なら Case 1 To 10 のように書ける。

Q3: If文の中で変数を宣言できる?

VBAではIf文の中で Dim は使えるが、変数のスコープはプロシージャ全体になる。If文の中だけで有効な変数は作れない。

Q4: If文で処理を途中で抜けたい

Exit Sub(Subを抜ける)または Exit For(ループを抜ける)を使う。If文自体を抜けるキーワードはない。

Q5: 空欄かどうかを判定したい

If Range("A1").Value = "" Then または If IsEmpty(Range("A1")) Then を使う。

まとめ

パターン 書き方 使う場面
If…Then 条件を満たしたときだけ処理 1つの条件チェック
If…Then…Else 2択に分岐 合格/不合格、あり/なし
If…ElseIf…Else 3つ以上に分岐 ランク判定、範囲判定
And / Or / Not 複数条件を組み合わせ 金額かつ権限、部署または役職
ネスト Ifの中にIf 階層的な条件分岐
Select Case 1つの変数で多分岐 値の列挙(A, B, C…)

If文が書けるようになれば、VBAのコードを自分でカスタマイズできるようになる。 まずはセクション2(If…Then…Else)のコードをコピペして、条件の数値を書き換えるところから始めてみてほしい。

次にやりたくなること

コメント

タイトルとURLをコピーしました