初心者向けにかみくだいて、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 >= 60とscore >= 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で余分な空白を削るのも実務では有効。
よくあるミス(初心者がハマるポイント)
- 条件の順番を間違える
例:If x > 0 Then … ElseIf x > 10 Then …の順だとx = 20のとき最初の条件で止まってしまい>10の処理に到達しない。 - 境界(= を含める/含めない)の漏れ
60点の判定を>60にしてしまうと 60 がどちらにも入らない可能性がある。>=や<=を意識する。 - 文字列の余分な空白や大小文字
” Yes” や “YES” をそのまま比較すると不一致になる。TrimとLCaseを使おう。 - 複雑になりすぎるネスト
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 の連発よりデバッグしやすい。
