🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

Excel VBAのIf Then Else文 — 仕組みと、Select Caseではなくこれを使う場面

|

Excel VBAのIf Then Else文 — 仕組みと、Select Caseではなくこれを使う場面

動作確認: Excel 365 v2509 · Excel 2021 · Excel 2019 · 最終確認 2026-06-05

要点If...Then...Elseは、条件がTrueかどうかで実行するコードを切り替えます。コピーして調整してください。

Sub 評価する()
    Dim score As Long
    score = Range("A1").Value

    If score >= 90 Then
        Range("B1").Value = "A"
    ElseIf score >= 75 Then
        Range("B1").Value = "B"
    ElseIf score >= 60 Then
        Range("B1").Value = "C"
    Else
        Range("B1").Value = "不合格"
    End If
End Sub

このブロックで条件分岐の9割は済みます。しかしどの形を選ぶか——そしてIfを静かに壊す落とし穴——を知ることの方が、スニペットをもう1つ集めるより大事です。

核心の考え方: If は「独立した問いのチェックリスト」

If...ElseIfチェックリストです。VBAは上から下へ読み、Yes/Noの問いを1つずつ投げ、最初にTrueと答えた問いの下のブロックを実行し——残りは飛ばします。決定的なのは、各問いが別々の変数を見てよいことです。

If 労働時間 > 40 Then                ' 労働時間についての問い
    給与 = "残業"
ElseIf 区分 = "業務委託" Then         ' 別の問い、区分について
    給与 = "定額"
Else
    給与 = "通常"
End If

この自由さ——各分岐が別のことを尋ねられる——こそIf存在理由です。そして、いつIfを卒業すべきかも教えてくれます。すべての分岐が同じ値を判定し始めた瞬間score >= 90score >= 75…)、チェックリストの部品で振り分けを作っています。これが Select Case へ切り替える合図です。

どんな構文エラーより多くのマクロを壊す落とし穴: VBAは短絡評価をしない

多くの言語ではIf a And baが偽ならaで止まり、bは決して見ません。VBAはそうしません。 常に両方を評価します。だから次は安全に見えて、安全ではありません。

' rng が Nothing のとき落ちる — VBA は rng.Rows.Count も評価する
If Not rng Is Nothing And rng.Rows.Count > 0 Then ...

rng Is NothingでもVBAはrng.Rows.Countを確認するため、ガードに見える行で実行時エラーになります。直し方は、問いを順番にすること——ネストして、1つ目を通ったときだけ2つ目が走るようにします。

If Not rng Is Nothing Then
    If rng.Rows.Count > 0 Then ...
End If

このたった1つの挙動が、「If条件は正しいのに!」というバグの大半を説明します。VBAが常に両オペランドを評価すると知れば、And/Orの中に危険な呼び出しを置かなくなります。

もう1つのルール: 1行の IfEnd If は要らない

書くIfはどれも2つの形のどちらかで、混ぜるのがコンパイルエラー第1位(「ブロック If に対応する End If がありません」)です。

' 1行 — 処理はちょうど1つ、End If なし
If cell.Value = 0 Then cell.Value = "該当なし"

' ブロック — 2行目や Else が要る瞬間、End If が要る
If cell.Value = 0 Then
    cell.Value = "該当なし"
    cell.Interior.Color = vbYellow
End If

ルールは単純です。処理が2つ、またはElseが必要? ブロック形にしてEnd Ifで閉じる。 中間はありません。

形は証拠——And・Or・ネスト・IIf

モデルはもう手元にあります。次はそれを働かせる構文です。

Andは全部真を要求、Orは1つでよい——初心者がつまずく区別:

If 金額 <= 5000 And 区分 = "管理職" Then 状態 = "自動承認"
If 金額 > 50000 Or フラグあり Then 状態 = "要確認"

ネストは本当に依存した問いを扱う——ただし2段までが、読みやすさが崩れる前の限界(そして再びSelect Caseの合図):

If country = "JP" Then
    If weight <= 1 Then 送料 = "通常" Else 送料 = "重量"
Else
    送料 = "海外"
End If

IIfは文ではなく関数——1行の2択に便利ですが、両方の引数を評価します(同じ非短絡ルール)。ゼロ除算や危険な呼び出しは絶対に入れないでください。

Range("C2").Value = IIf(Range("A2").Value > 0, "黒字", "赤字")

IfとSelect Caseの使い分け

状況 使うもの
分岐が別々の変数を尋ねる If...ElseIf
結果が1〜2通り If...Else
同じ値に対して3通り以上 Select Case
1つの値の範囲(1〜10、11〜20…) Select Case ... To

正直なルール: 別々の問い → チェックリスト(If)。1つの値・多くの答え → 振り分け(Select Case)。

よくあるエラー——なぜ起きるか

  • 「ブロック If に End If がない」/「If に対応しない Else」。 1行形とブロック形を混ぜています。インデントし直し、各ブロックIfにちょうど1つのEnd Ifを。
  • 条件がいつも成立する/しない。 多くは型の不一致(文字列と数値)か、大文字小文字("はい" <> "ハイ")。Debug.Printで条件を確認。
  • 「ガード」なのに落ちる。 非短絡——AndをネストしたIfに分ける。
  • 文字列比較が外れる。 "入金済" <> "入金済 "(末尾スペース)。両辺をTrim()で囲むか、Option Compare Textを。

条件がコードより長生きするとき

Ifは別々の問いで分岐するのに適した道具です——しかし業務ルールはじっとしていません。新しいしきい値が増えるたびに編集・再テストし、半年後にどこかの分岐を壊していないか祈ることになります。ExcelMaster Agent なら、ルールを自然な日本語で述べるだけ——「D列の支払期日が過ぎていて、ステータスが入金済でない行を赤くして」——ロジックを生成し、End Ifの付け忘れもありません。無料で試す →

関連ガイド

よくある質問

Select CaseではなくIfを使うべきなのはいつ? 分岐が別々の変数を尋ねるとき、または結果が1〜2通りのときです。すべての分岐が同じ値を3つ以上の選択肢と照合し始めたら、Select Caseの方が読みやすくなります。

VBAはAnd / Orを短絡評価しますか? しません。VBAは毎回両方のオペランドを評価します。Nothingオブジェクトや存在しないキーで失敗しうる呼び出しを、Andの後半に置かないでください——条件をネストします。

If Then Elseを1行で書けますか? 複数行のElseを伴わない単一処理に限ります(If x > 0 Then y = 1)。Elseや2つ目の文が加わったら、End If付きのブロック形が必須です。

IfとIIfの違いは? Ifはどの行を実行するかを制御する「文」。IIf()は2つの値のどちらかを返す「関数」で、両方を評価します。危険な式は入れないでください。