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

VBA
スポンサーリンク
スポンサーリンク

この記事でできること

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

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

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

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

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

完成イメージ(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」と判定する。

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() で小文字に統一してから比較するか、全角⇔半角を一括変換してデータを統一する方法 で事前にデータを統一しておくと安心。

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をコピーしました