エクセルVBAのIf文を基礎から学ぶ初心者ガイド!
初心者エクセルVBAのIf文が知りたい!
IF関数とは違うの?



エクセルのIF関数と書き方は違うけど、機能は同じだよ!
この記事はエクセルVBAのIf文について、基本の使い方からエラーになりがちなポイントまで、初心者でも分かりやすく解説しています。
コピーして使えるコード付きで、学んだことをすぐに実務に活用できます。
IfとEnd Ifはセット- 複数条件は
ElseIfを活用。条件は範囲の狭い順に書く - 論理演算子
AndはOrより先に評価される - 同じ変数を4回以上比較するならSelect Case文を活用
エクセルVBAのなかでもIf文はよく使われますが、エクセルIF関数を知っていれば、コードの書き方を覚えるだけなのでそれほど難しくありません。
If文と一緒に使われる「基本のコード」を知りたい方は、こちらの記事もご覧ください。
エクセルマクロの基礎をゼロから学ぶ!有効化やボタン設置!
エクセルVBAのIf文は何?条件分岐の基本
エクセルVBAのIf文とは、「もし○○なら△△する」という条件分岐をする構文です。
- セルの点数が60点以上なら隣のセルに「合格」と表示
- セルが空白なら処理をスキップ
VBAでは、「条件を満たすかどうか」の判定をIf~処理~End Ifのセットで書きます。
If~End Ifの間は、Tabを押してインデントを入れコードを読みやすくしましょう。
今回は以下の「テストの点数表」を作例に解説します。


基本のIf文と省略記法を試してみよう
最も基本となる形は、条件を満たしたときだけ処理を実行するパターンです。
「If 条件Then条件に当てはまる場合の処理End If」がコードの一つの塊です。
点数が60点以上のときに「合格です」とメッセージボックスを表示させてみましょう。


- 「開発」タブを押す
- 「Visual Basic」をクリック


- 「挿入」タブをクリック
- 「標準モジュール」を選択


- 「挿入」タブを押す
- 「プロシージャ」をクリック


- 「名前」にマクロ名を入力
- 「OK」ボタンを押す


Public Sub 合否判定()とEnd Subの間に、次のコードを挿入します。
Dim score As Long
score = Range("B4").Value
If score >= 60 Then
MsgBox "合格です"
End Ifこのコードは次の処理を指示しています。
- 変数
scoreにB4セルの値を格納 - 変数
scoreに格納された数値が60以上かどうか判定 - 60以上の場合はメッセージボックスを表示


- エクセルに戻り、B4セルの点数を確認
- VBAエディターの「▶実行」ボタンを押す


今回の例はB4セルの点数が85だったため、メッセージボックスが表示されました。
「OK」ボタンを押して処理を終了しましょう。
条件を満たさないときも別の処理がしたい場合は、Elseを追加します。


このコードは、先ほどのコードに以下を追加しただけです。
Else
MsgBox "不合格です"次の手順でマクロを確認してみましょう。


- B4セルの点数を60未満に変更する
- VBAエディターに戻り、「▶実行」をクリック
- メッセージが表示されることを確認
点数が60以上なら「合格です」、そうでなければ「不合格です」と表示されます。
この場合もEnd Ifを忘れずに書きましょう。
処理が1つだけのシンプルな場合は、If文を1行にまとめて書けます。
この場合はEnd Ifは不要です。


ただ、処理が増えてきたときに読みにくくなるため、基本の書き方を行うことをお勧めします。
If文の複数条件を使おう!3つ以上の条件もOK
条件が3つ以上に分かれる場合は、ElseIfを使って順番に条件に当てはまるか確認していきます。
例えば点数によって「A評価~D評価・不合格」の5パターンに分けてメッセージボックスを表示させたい場合は、次のように書きましょう。
Public Sub 段階評価()
Dim score As Long
score = Range("B4").Value
If score >= 90 Then
MsgBox "A評価"
ElseIf score >= 70 Then
MsgBox "B評価"
ElseIf score >= 50 Then
MsgBox "C評価"
ElseIf score >= 40 Then
MsgBox "D評価"
Else
MsgBox "不合格"
End If
End Subこれまでと同様、B4セルの点数を評価するマクロです。
「ElseIf条件Then条件に当てはまる場合の処理」が追加されています。
標準モジュールにコードを貼ったうえで、次の手順でマクロの結果を確認してみましょう。


- B4セルの点数を変更する
- VBAエディターに戻り、「▶実行」を押す
- メッセージが表示されることを確認
いくつか点数を変えてみて、マクロの結果がどう変化するのか確かめてみましょう。
ここで重要なのが、If文は条件を上から順番に評価することです。


最初に条件を満たした箇所の処理を実行し、残りはすべてスキップします。
例えば上記の67点の例は、次の流れで処理を行っています。
score >= 90に当てはまらないので次の処理へscore >= 70に当てはまらないので次の処理へscore >= 50に当てはまるので「C評価」と表示score >= 40以降の条件はスキップ
ここでscore >= 90~score >= 40の記載順を逆にしてしまうと、90点以上の場合でも、最初のscore >= 40に当てはまってしまうため、「D評価」と表示されてしまいます。
複数条件を使うときは、より範囲の狭い条件から先に書くようにしましょう。



厳しい条件から先に書くのが鉄則だよ!
If文を動かす「演算子」をマスターしよう!
マクロを動かすために重要となるのが、「演算子」です。
演算子とは、数学やプログラミングで使われるもので、特定の計算や処理を行うために使うものです。
If文では「比較演算子」と「論理演算子」が使われます。
この2つをマスターすることで、より実務に使えるコードが作れるようになります。
数値判定に必須の「比較演算子」をおさらい
比較演算子は数値判定に必須となります。
ここで、エクセルのIF関数でも使われることの多い比較演算子をおさらいしておきましょう。
| 演算子 | 意味 | 使用例 |
|---|---|---|
| = | 等しい | score = 8080と等しい |
| <> | 等しくない | hyouka <> "C"Cと等しくない |
| > | より大きい | score > 8080より大きい |
| < | より小さい・未満 | score < 8080未満 |
| >= | 以上 | score >= 8080以上 |
| <= | 以下 | score <= 8080以下 |
比較演算子は文字列にももちろん使えますが、使用するうえで注意点があります。
それは、VBAの文字列比較の場合、大文字と小文字を区別して判定する点です。
例えば次のコードを標準モジュールに貼って試してみましょう。
Public Sub C評価を調べる()
Dim hyouka As String
hyouka = Range("C5").Value
If hyouka = "C" Then
MsgBox "C評価です"
ElseIf hyouka <> "C" Then
MsgBox "C評価ではありません"
End If
End SubセルC5の値を変数hyoukaに格納し、その値が「C」だった場合には「C評価です」と表示させています。
値が「C」ではない場合は「C評価ではありません」と表示されます。
以下の手順でマクロの結果を確認してみましょう。


- エクセルのセルC5に小文字で「c」と入力
- VBAエディターに戻り、「▶実行」をクリック
- 「C評価ではありません」と表示されることを確認
「大文字C」と「小文字c」が区別されるため、C評価のつもりで入力されたものでも、意図した動きにはなりません。
エクセルの入力規則を使って表記ゆれが起きないようにするのがベストですが、もしも表記ゆれが想定される場合は、以下のようにLCase()で変数hyoukaを囲って小文字に統一しましょう。
Public Sub C評価を調べる大文字小文字対応()
Dim hyouka As String
hyouka = Range("C7").Value
If LCase(hyouka) = "c" Then '◆ここを変更
MsgBox "C評価です"
Else
MsgBox "C評価ではありません"
End If
End Sub先ほどのコードと比較するため、確認するセルをC5からC7に変更しました。
また、LCase()で変数hyoukaを囲むと小文字に変換されるため、If文の条件も「大文字C」から「小文字c」に変更しています。
以下の手順でマクロを実行してみましょう。


- エクセルのセルC7に大文字で「C」と入力
- VBAエディターに戻り、「▶実行」をクリック
- 「C評価です」と表示されることを確認
以下の流れで処理が行われています。
LCase()によって、セルC7の「大文字C」が小文字に変換LCase(hyouka) = "c"に当てはまるので「C評価です」と表示Elseはスキップ
他の文字でも結果を確かめてみましょう。
これで大文字と小文字が混在しているデータでも、事前作業なしでマクロを実行できます。
小さな工夫ですが、データ量が多い場合は作業時間に差が出てくるので覚えておきましょう。
「論理演算子」の使い分けがIf文の完成度を高める
複数の条件を組み合わせて判定したい場合は、「論理演算子」を使います。
エクセルVBAで使える論理演算子は複数ありますが、実務でよく使うのはAnd・Or・Notの3つです。
ここではこの3つを解説します。
AndとOrで条件を組み合わせる
エクセルでAND関数やOR関数はよく使われるので、使い方のイメージがしやすいはずです。
以下の条件で処理を実行したいときにAndとOrを使います。
And:両方の条件を満たす場合Or:どちらか一方を満たす場合
次のVBAはAndを使ってセルB4の点数が90点台かどうかを調べています。
Public Sub 点数の範囲を調べる()
Dim score As Long
score = Range("B4").Value
If score >= 90 And score < 100 Then
MsgBox "90点台です"
Else
MsgBox "90点台ではありません"
End If
End Sub

以下の2つの条件の両方を満たす場合に「90点台です」と表示されます。
score >= 90score < 100
AndやOrはひとつのIf文に複数個を組み合わせても構いません。
Notで条件を否定する
NotもエクセルのNOT関数と同じで、「○○でない場合」に使われます。
実務ではセルの空白チェックをする際によく使われます。
Public Sub 空白を調べる()
If Not IsEmpty(Range("B4").Value) Then
MsgBox "値が入力されています"
Else
MsgBox "空白セルです"
End If
End Sub

IsEmpty(Range("B4").Value)でB4セルが空白かどうかを判定しています。
IsEmpty()は、セルが空白のときTrueを返す関数です。
本来、空白のときにThen以下の処理を実行するのですが、Notが付いていることで真偽が逆転され、「空白でない場合」に処理を実行しています。
AndとOrを組み合わせるときの優先順位に注意
AndとOrを組み合わせることで、より複雑なIf文を作ることができます。
If (条件A And 条件B) Or (条件C And 条件D) Or (条件E And 条件F) Then
・・・
End Ifこのコードは、以下の3つのうちどれか1つ以上に当てはまる場合に、処理が実行されます。
- 条件Aと条件Bの両方がTrue
- 条件Cと条件Dの両方がTrue
- 条件Eと条件Fの両方がTrue
なお、AndとOrを1つのIf文に組み合わせる場合は、条件の優先順位に注意が必要です。
AndはOrより先に評価されます。
例えばA Or B And Cの場合、日本語で読むと「AまたはB」かつ「C」と読めなくもありません。
しかし、VBAの場合はAndが優先されるため、「A」または「BかつC」となります。
算数の掛け算と足し算の組み合わせのように、カッコ()を使用してグループ化する習慣をつけましょう。
「AまたはB」かつ「C」としたい場合は、次のようにカッコを付けます。
(A Or B) And Cカッコの有無に関わらず意図した意味になる場合でも、後から別の人がコードを見た場合に分かりやすいようにカッコを付けておくことをお勧めします。
多分岐にマスト!If文のネストとSelect Case文
ElseIfを使うことで複数条件の分岐ができますが、条件の数がさらに増えてくると別の書き方のほうが見やすい場合もあります。
ここでは、If文を入れ子にする「ネスト」と、多分岐をスッキリと書ける「Select Case文」を解説します。
条件の数や種類に応じて使い分けましょう。
If文の中にIf文を書いて多分岐させよう
If文の中にさらにIf文を書くことを「ネスト」と呼びます。
例えば次のように、2段階以上の判定をしたいときに使います。
- 条件Aを確認
- 条件Aを満たしていたら条件Bを確認
- 条件Bを満たしていたら処理を行う



エクセルのIF関数でもよく使われるよ!
例えば「3教科とも50点以上なら合格」という条件を判定するコードは次のようになります。
Public Sub ネスト判定()
Dim score1 As Long
Dim score2 As Long
Dim score3 As Long
score1 = Range("B4").Value '国語
score2 = Range("B5").Value '数学
score3 = Range("B6").Value '英語
If score1 >= 50 Then
If score2 >= 50 Then
If score3 >= 50 Then
MsgBox "3教科合格"
Else
MsgBox "3教科合格ではない"
End If
Else
MsgBox "3教科合格ではない"
End If
Else
MsgBox "3教科合格ではない"
End If
End Subこれは教科ごとの点数をscore1・score2・score3の3つの変数に格納し、3つのIf文で各教科の点数を判定しています。


以下の手順でマクロを実行してみましょう。


- エクセルのセルB4・B5・B6に点数を入力
- VBAエディターに戻り、「▶実行」をクリック
- 点数に応じた結果が表示されることを確認
50点未満の点数も織り交ぜながら、何回か試してみましょう。
ネストの注意点として、Ifの数だけEnd Ifも対応させる必要があります。
また、コードを見やすくするために、入れ子の単位でインデントを1段深くすることをお勧めします。
多分岐をIf文より簡潔にするSelect Case文
ElseIfを何段も重ねると、コードが縦に長くなりがちです。
同じ変数を何回も比較したい場合は、Select Case文を使うとコードがスッキリします。
「If文の複数条件を使おう!3つ以上の条件もOK」の章で解説した5段階評価をSelect Case文で書き直すと、次のようになります。
Public Sub 段階評価SelectCase文()
Dim score As Long
score = Range("B4").Value
Select Case score
Case 90 To 100
MsgBox "A評価"
Case 70 To 89
MsgBox "B評価"
Case 50 To 69
MsgBox "C評価"
Case 40 To 49
MsgBox "D評価"
Case Else
MsgBox "不合格"
End Select
End Sub左右に並べて比較すると、Select Case文のほうが文字数が少なく変数も1度しか登場しないので、直感的にコードを理解しやすいことが分かります。


Select Case文ではSelect Case 変数名で判定する変数を宣言し、各Caseに条件を書きます。
上から順に評価され、最初に一致したCaseの処理だけが実行されるのは、If文と同じ構造です。
また、Case ElseはIf文のElseと同じ役割です。
Caseの条件は、次のように様々な書き方ができます。
Case 60 To 89:60以上89以下の範囲Case 1, 3, 5:カンマ区切りで複数の値を指定Case Is >= 90:比較演算子を使用
状況に応じてIf文とSelect Case文を使い分けて、見やすいVBAを作りましょう。
If文とSelect Case文の使い分けに迷った場合は、以下の表を参考にしてください。
| 状況 | お勧めの使い分け | 理由 |
| 同じ変数を4個以上の条件と比較したい | Select Case | If~ElseIfよりもコードが見やすい |
| 条件が1~3個で異なる変数もある | IfまたはIf~ElseIf | OrやAndも活用して柔軟に対応できる |
| 条件を段階的に絞り込みたい | ネストIf | 条件A→B→Cと、順を追って絞り込める |
同じ変数を何度も使うならSelect Case文、条件を段階的に絞りこむならネストIf文、それ以外はIf文を使うと覚えておきましょう。
実務でよく使うIf文3選
ここからは実務でよく使われるIf文をご紹介します。
コピーしてそのまま使えますが、状況に応じてコードを変更してください。
セルの値を判定して背景色を変える
点数が60点未満のセルを自動で赤くする例です。
For~Nextで繰り返し処理をしています。
Public Sub 点数によりセルに色を付ける()
Dim i As Long
For i = 4 To 13
If Cells(i, 2).Value < 60 Then
Cells(i, 2).Interior.Color = RGB(255, 0, 0)
Else
Cells(i, 2).Interior.ColorIndex = xlNone
End If
Next i
End Subコードを変更するポイントは次のとおりです。


- 行の範囲を変更したい:作例では4~13行を繰り返し処理
- 列番号を変更したい:作例では2列目を参照
- 色を変更したい:作例では赤を使用
繰り返し処理とIf文は実務で一緒に使われるケースが多いです。
まずは小さな繰り返し処理から慣れていきましょう。
重複チェックの結果を判定する
CountIfで重複チェックをしてからIf文で処理を分岐するパターンは、実務でよく使われます。
Public Sub 重複チェック()
Dim kyouka As String
Dim cnt As Long
kyouka = Range("D1").Value
cnt = WorksheetFunction.CountIf(Range("A4:A13"), kyouka)
If cnt > 0 Then
MsgBox kyouka & " はすでに記載されています"
Else
MsgBox kyouka & " は未記載です"
End If
End Subコードを変更するポイントは次のとおりです。


- 検索するセルを変更したい:作例ではD1を指定
- 重複チェックする範囲を変更したい:作例ではA4~A13を指定
If文の処理を変えることで様々な活用ができますので、ぜひアレンジしてください。
メッセージボックスの「はい・いいえ」でIf分岐
削除や上書きの確認ダイアログとしてよく使われます。
以下のコードではThisWorkbook.Saveで上書き保存をしています。
Public Sub 上書き保存()
Dim answer As Long
answer = MsgBox("データを上書き保存しますか?", vbYesNo + vbQuestion)
If answer = vbYes Then
ThisWorkbook.Save
MsgBox "保存しました"
Else
MsgBox "キャンセルしました"
End If
End Sub

メッセージボックスの内容やIf文の処理を変えてご活用ください。
エクセルVBAのIf文に関するQ&A
If文をマスターしてVBAをレベルアップ!
エクセルVBAのIf文を使った条件に応じた処理の自動化について解説しました。
演算子やネスト、Select Case文を組み合わせることで、複雑な条件分岐でも対応できるようになります。
それではポイントのおさらいです。
IfとEnd Ifはセット- 複数条件は
ElseIfを活用。条件は範囲の狭い順に書く - 論理演算子
AndはOrより先に評価される - 同じ変数を4回以上比較するならSelect Case文を活用
まずは基本のIf文から試して、徐々にElseIfやSelect Case文にチャレンジしてみましょう!
また、VBAの基本を知ることで、If文の活用の幅がさらに広がります。
以下の記事もぜひご参照ください。
エクセルマクロの基礎をゼロから学ぶ!有効化やボタン設置!