Excel VBA | If..ElseIf 文を使った複数条件分岐

VBA
スポンサーリンク

初心者向けにかみくだいて、If … ElseIf … Else … End If の仕組みを例題(コード)→動きの説明→練習問題(解答付き)の順で詳しく説明します。実際にコピーしてマクロで動かせるコードも載せます。

If…ElseIf の基本(かんたんに)

  • 何をするか:複数の条件を順番にチェックして、最初に当てはまる処理だけを実行するための構文。
  • 形:
If 条件1 Then
    条件1がTrueのときの処理
ElseIf 条件2 Then
    条件2がTrueのときの処理
ElseIf 条件3 Then
    条件3がTrueのときの処理
Else
    どれにも当てはまらないときの処理(省略可)
End If
VB
  • 大事なポイント:上から順に評価して、最初にTrueになったブロックだけ実行して残りはスキップします。だから条件の「書く順」が結果に影響します。

イメージ図(テキストで)

Start -> evaluate 条件1? --Yes--> 処理1 -> End
                     |
                     No
                     v
               evaluate 条件2? --Yes--> 処理2 -> End
                     |
                     No
                     v
               evaluate 条件3? --Yes--> 処理3 -> End
                     |
                     No
                     v
                    Else処理 -> End

例題①:点数で判定(基本)

セル B2 に点数(整数)があるとき、判定するマクロ。

Option Explicit

Sub 判定_基本()
    Dim score As Long
    score = Range("B2").Value
    
    If score >= 80 Then
        MsgBox "評価:優(80点以上)"
    ElseIf score >= 60 Then
        MsgBox "評価:可(60〜79点)"
    Else
        MsgBox "評価:不可(59点以下)"
    End If
End Sub
VB

動きの説明

  • score >= 80 をまず評価。Trueならそこで終了(「優」)。
  • Falseなら次の ElseIf score >= 60 を評価(ここは 60〜79 が該当)。
  • どちらも該当しなければ Else(59以下)へ。
  • 重要:ElseIf score >= 60score >= 80 の順序が逆だと誤判定する可能性がある(優を取りこぼす)。だから「高い順」で書くのが普通です。

例題②:範囲チェック(複数の条件)

商品の在庫数に応じてメッセージを出す例。

Option Explicit

Sub 在庫チェック()
    Dim stock As Long
    stock = Range("C2").Value
    
    If stock <= 0 Then
        MsgBox "在庫なし:発注してください"
    ElseIf stock <= 5 Then
        MsgBox "在庫少:早めに補充"
    ElseIf stock <= 20 Then
        MsgBox "在庫普通"
    Else
        MsgBox "在庫十分"
    End If
End Sub
VB

ポイント

  • 範囲条件は「境界」を意識して書く(<= 5<= 20 のように上限で区切る書き方はわかりやすい)。
  • 下から書くと分かりにくくなるので、読みやすい順序(ここでは小さい方から順)で書いています。

例題③:文字列で判断(大文字小文字に注意)

セル A2 に文字列(”Yes” / “No” / それ以外)が入っている場合。

Option Explicit

Sub 文字判定()
    Dim ans As String
    ans = Trim(Range("A2").Value) '前後の空白除去
    
    If LCase(ans) = "yes" Then
        MsgBox "承認されました"
    ElseIf LCase(ans) = "no" Then
        MsgBox "却下されました"
    Else
        MsgBox "不明な値です:" & ans
    End If
End Sub
VB

ポイント

  • 文字列比較は大文字小文字で挙動が変わるので、LCase/UCase で揃えると安全。
  • Trim で余分な空白を削るのも実務では有効。

よくあるミス(初心者がハマるポイント)

  1. 条件の順番を間違える
    例:If x > 0 Then … ElseIf x > 10 Then … の順だと x = 20 のとき最初の条件で止まってしまい >10 の処理に到達しない。
  2. 境界(= を含める/含めない)の漏れ
    60点の判定を >60 にしてしまうと 60 がどちらにも入らない可能性がある。>=<= を意識する。
  3. 文字列の余分な空白や大小文字
    ” Yes” や “YES” をそのまま比較すると不一致になる。TrimLCase を使おう。
  4. 複雑になりすぎるネスト
    If のネストが深くなると読みにくくなり、バグのもと。複雑なら Select Case(後述)や関数化を検討。

補足:ネストした If(入れ子)の例

内部でさらに細かい判定が必要なとき。

Option Explicit

Sub ネスト例()
    Dim score As Long
    score = Range("B2").Value
    
    If score >= 60 Then
        '合格の中でも区別したい
        If score >= 90 Then
            MsgBox "秀(90点以上)"
        ElseIf score >= 80 Then
            MsgBox "優(80〜89点)"
        Else
            MsgBox "可(60〜79点)"
        End If
    Else
        MsgBox "不合格"
    End If
End Sub
VB

注意:ネストすると可読性が下がるので、可能なら条件を平たく書く(先に ElseIf で分ける)方が良いことが多いです。


練習問題(全部解答付き)

短時間で確かめられるものを3つ用意します。コードはそのまま実行できます(シートの該当セルに値を入れて)。

問題1

セル B2 に 0〜100 の点数が入っている。以下ルールでメッセージを表示するマクロを書け。

  • 90以上:「A」
  • 75〜89:「B」
  • 60〜74:「C」
  • 60未満:「D」

解答コード

Sub Q1()
    Dim s As Long
    s = Range("B2").Value
    If s >= 90 Then
        MsgBox "A"
    ElseIf s >= 75 Then
        MsgBox "B"
    ElseIf s >= 60 Then
        MsgBox "C"
    Else
        MsgBox "D"
    End If
End Sub
VB

解説:高い方から順に評価していく(90→75→60)ことで全ての点数に対応できる。


問題2

セル C2 に在庫数(整数)が入っている。

  • 0:「在庫なし」
  • 1〜3:「残りわずか」
  • 4〜9:「在庫あり」
  • 10以上:「豊富」

解答コード

Sub Q2()
    Dim n As Long
    n = Range("C2").Value
    If n = 0 Then
        MsgBox "在庫なし"
    ElseIf n <= 3 Then
        MsgBox "残りわずか"
    ElseIf n <= 9 Then
        MsgBox "在庫あり"
    Else
        MsgBox "豊富"
    End If
End Sub
VB

解説n = 0 を先に書くことで 0 を確実に判定。以降は上限で区切る書き方。


問題3

セル A2 に文字列 "男" または "女" が入る。その他のときは 「不明」 を出す。大文字小文字は関係ない(日本語なので大文字の問題はないが、余分な空白に注意)。

解答コード

Sub Q3()
    Dim g As String
    g = Trim(Range("A2").Value)
    
    If g = "男" Then
        MsgBox "男性"
    ElseIf g = "女" Then
        MsgBox "女性"
    Else
        MsgBox "不明"
    End If
End Sub
VB

解説:Trim で空白を削る。条件は順序どおりで OK。


もう一歩上のコツ

  • 条件が単純に1つの式で判定できるなら If … ElseIf で十分。複雑に多岐に渡る「値の分類」は Select Case の方が見やすくなる(例:複数の値を比較する場合)。
  • 条件が長くなったら、途中で Boolean 変数に入れて可読性を上げる。 Dim isAdult As Boolean isAdult = (age >= 20) If isAdult Then ...
  • テスト用に Debug.Print を使うと MsgBox の連発よりデバッグしやすい。
VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました