この記事でできること
VBAのコードをコピペして動かしている。便利だ。でもIf文の部分を自分の条件に書き換えようとすると、手が止まる。
「If…Then…Else」の構文は何となく読める。でも「3つ以上の分岐はどう書くの?」「AndとOrはどう組み合わせるの?」「If文の中にIf文を入れていいの?」——自分で条件を書けない。
If文が書けるようになれば、コードを自分の業務に合わせてカスタマイズできる。If文はVBAの全ての処理の土台だ。
この記事では、If文の基本から複数条件・ネストまで、段階的に全パターンを解説する。各パターンにコピペで動くコード例付き。
- 対象:If文を自分で書けるようになりたい人
- 所要時間:通読約15分。手を動かしながらなら30分
—
完成イメージ(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」と判定する。
—
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)のコードをコピペして、条件の数値を書き換えるところから始めてみてほしい。
—
次にやりたくなること
- セルの値に応じて行を自動色分けする方法 — If文で条件判定→色を変える実践
- エラー処理(On Error)で止まらないマクロを作る方法 — If文と合わせて使うエラー対策
- 複数条件でデータを抽出して別シートにまとめる方法 — If文の条件判定を応用したデータ抽出
—
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "VBAのIf文とIIf関数はどう違う?",
"acceptedAnswer": {
"@type": "Answer",
"text": "IIf(条件, 真の値, 偽の値)は1行で書けるが、真の値と偽の値の両方が常に評価される。エラーが起きる式を含む場合はIfを使う方が安全。"
}
},
{
"@type": "Question",
"name": "VBAのIf文で条件が10個以上ある場合はどうする?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Select Caseを使う。値の列挙が10個でも見やすく書ける。範囲指定ならCase 1 To 10のように書ける。"
}
},
{
"@type": "Question",
"name": "VBAのIf文の中で変数を宣言できる?",
"acceptedAnswer": {
"@type": "Answer",
"text": "VBAではIf文の中でDimは使えるが、変数のスコープはプロシージャ全体になる。If文の中だけで有効な変数は作れない。"
}
},
{
"@type": "Question",
"name": "VBAのIf文で空欄かどうかを判定したい",
"acceptedAnswer": {
"@type": "Answer",
"text": "If Range(\"A1\").Value = \"\" Then または If IsEmpty(Range(\"A1\")) Then を使う。"
}
},
{
"@type": "Question",
"name": "VBAのIf文でElseIfが実行されないのはなぜ?",
"acceptedAnswer": {
"@type": "Answer",
"text": "If文は上から順に評価し、最初に一致した分岐だけを実行する。厳しい条件(大きい値)を上に書くのが鉄則。"
}
}
]
}


コメント