この記事でできること
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に同じ順番で実行させるための書き方だ。

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

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

| 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文の使い分けを先に整理する

最初は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)のコードをコピペして、条件の数値を書き換えるところから始めてみてほしい。
次にやりたくなること
- セルの値に応じて行を自動色分けする方法 — If文で条件判定→色を変える実践
- エラー処理(On Error)で止まらないマクロを作る方法 — If文と合わせて使うエラー対策
- 複数条件でデータを抽出して別シートにまとめる方法 — If文の条件判定を応用したデータ抽出


コメント