エクセルVBAのIf文を基礎から学ぶ初心者ガイド!

初心者

エクセルVBAIf文が知りたい!
IF関数とは違うの?

Dr.オフィス

エクセルのIF関数と書き方は違うけど、機能は同じだよ!

この記事はエクセルVBAのIf文について、基本の使い方からエラーになりがちなポイントまで、初心者でも分かりやすく解説しています。

コピーして使えるコード付きで、学んだことをすぐに実務に活用できます。

If文のポイント
  1. IfEnd Ifはセット
  2. 複数条件はElseIfを活用。条件は範囲の狭い順に書く
  3. 論理演算子AndOrより先に評価される
  4. 同じ変数を4回以上比較するならSelect Case文を活用

エクセルVBAのなかでもIf文はよく使われますが、エクセルIF関数を知っていれば、コードの書き方を覚えるだけなのでそれほど難しくありません。

If文と一緒に使われる「基本のコード」を知りたい方は、こちらの記事もご覧ください。

エクセルマクロの基礎をゼロから学ぶ!有効化やボタン設置!

\ Officeドクター読者限定・無料Q&A /

この記事の内容でわからないことや、今すぐ解決したいOfficeのお悩みはありませんか?
Officeドクターの中の人が、公式LINEで直接ご質問にお答えします!
下のボタンをタップして、表示された入力欄からそのまま送信してくださいね。

目次

エクセルVBAのIf文は何?条件分岐の基本

エクセルVBAのIf文とは、「もし○○なら△△する」という条件分岐をする構文です。

条件分岐の例
  • セルの点数が60点以上なら隣のセルに「合格」と表示
  • セルが空白なら処理をスキップ

VBAでは、「条件を満たすかどうか」の判定をIf~処理~End Ifのセットで書きます。

IfEnd Ifの間は、Tabを押してインデントを入れコードを読みやすくしましょう。

今回は以下の「テストの点数表」を作例に解説します。

If文の作例
If文の作例

基本のIf文と省略記法を試してみよう

最も基本となる形は、条件を満たしたときだけ処理を実行するパターンです。

If 条件Then条件に当てはまる場合の処理End If」がコードの一つの塊です。

点数が60点以上のときに「合格です」とメッセージボックスを表示させてみましょう。

STEP
VBAエディターを起動する
「開発」タブより追加
「開発」タブより追加
  • 「開発」タブを押す
  • 「Visual Basic」をクリック
STEP
標準モジュールを挿入
「挿入」タブより作業
「挿入」タブより作業
  • 「挿入」タブをクリック
  • 「標準モジュール」を選択
STEP
プロシージャを追加
同じく挿入タブより操作
同じく挿入タブより操作
  1. 「挿入」タブを押す
  2. 「プロシージャ」をクリック
STEP
マクロ名を入力
名前は日本語でOK
名前は日本語でOK
  • 「名前」にマクロ名を入力
  • 「OK」ボタンを押す
STEP
コードを記述する
コードはコピペでOK
コードはコピペでOK

Public Sub 合否判定()End Subの間に、次のコードを挿入します。

Dim score As Long
score = Range("B4").Value

    If score >= 60 Then

        MsgBox "合格です"

    End If

このコードは次の処理を指示しています。

  1. 変数scoreにB4セルの値を格納
  2. 変数scoreに格納された数値が60以上かどうか判定
  3. 60以上の場合はメッセージボックスを表示
STEP
マクロを試してみる
実際の動きを確認
実際の動きを確認
  • エクセルに戻り、B4セルの点数を確認
  • VBAエディターの「▶実行」ボタンを押す
STEP
結果を確認
60以上の場合はメッセージボックスが表示される
60以上の場合はメッセージボックスが表示される

今回の例はB4セルの点数が85だったため、メッセージボックスが表示されました。

「OK」ボタンを押して処理を終了しましょう。

条件を満たさないときも別の処理がしたい場合は、Elseを追加します。

Elseを追加
Elseを追加

このコードは、先ほどのコードに以下を追加しただけです。

    Else
        MsgBox "不合格です"

次の手順でマクロを確認してみましょう。

B4セルの点数を変えて実行
B4セルの点数を変えて実行
  • 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セルの点数を変更する
B4セルの点数を変更する
  • B4セルの点数を変更する
  • VBAエディターに戻り、「▶実行」を押す
  • メッセージが表示されることを確認

いくつか点数を変えてみて、マクロの結果がどう変化するのか確かめてみましょう。

ここで重要なのが、If文は条件を上から順番に評価することです。

評価は上から
評価は上から

最初に条件を満たした箇所の処理を実行し、残りはすべてスキップします。

例えば上記の67点の例は、次の流れで処理を行っています。

  1. score >= 90に当てはまらないので次の処理へ
  2. score >= 70に当てはまらないので次の処理へ
  3. score >= 50に当てはまるので「C評価」と表示
  4. score >= 40以降の条件はスキップ

ここでscore >= 90score >= 40の記載順を逆にしてしまうと、90点以上の場合でも、最初のscore >= 40に当てはまってしまうため、「D評価」と表示されてしまいます。

複数条件を使うときは、より範囲の狭い条件から先に書くようにしましょう。

Dr.オフィス

厳しい条件から先に書くのが鉄則だよ!

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評価です」と表示されることを確認

以下の流れで処理が行われています。

  1. LCase()によって、セルC7の「大文字C」が小文字に変換
  2. LCase(hyouka) = "c"に当てはまるので「C評価です」と表示
  3. Elseはスキップ

他の文字でも結果を確かめてみましょう。

これで大文字と小文字が混在しているデータでも、事前作業なしでマクロを実行できます。

小さな工夫ですが、データ量が多い場合は作業時間に差が出てくるので覚えておきましょう。

「論理演算子」の使い分けがIf文の完成度を高める

複数の条件を組み合わせて判定したい場合は、「論理演算子」を使います。

エクセルVBAで使える論理演算子は複数ありますが、実務でよく使うのはAndOrNotの3つです。

ここではこの3つを解説します。

AndOrで条件を組み合わせる

エクセルでAND関数やOR関数はよく使われるので、使い方のイメージがしやすいはずです。

以下の条件で処理を実行したいときにAndOrを使います。

  • 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点台です」と表示されます。

  1. score >= 90
  2. score < 100

AndOrはひとつの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が付いていることで真偽が逆転され、「空白でない場合」に処理を実行しています。

AndOrを組み合わせるときの優先順位に注意

AndOrを組み合わせることで、より複雑なIf文を作ることができます。

If (条件A And 条件B) Or (条件C And 条件D) Or (条件E And 条件F) Then

   ・・・

End If

このコードは、以下の3つのうちどれか1つ以上に当てはまる場合に、処理が実行されます。

  1. 条件Aと条件Bの両方がTrue
  2. 条件Cと条件Dの両方がTrue
  3. 条件Eと条件Fの両方がTrue

なお、AndOrを1つのIf文に組み合わせる場合は、条件の優先順位に注意が必要です。

AndOrより先に評価されます。

例えば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段階以上の判定をしたいときに使います。

  1. 条件Aを確認
  2. 条件Aを満たしていたら条件Bを確認
  3. 条件Bを満たしていたら処理を行う
Dr.オフィス

エクセルの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

これは教科ごとの点数をscore1score2score3の3つの変数に格納し、3つのIf文で各教科の点数を判定しています。

入れ子が3つある
入れ子が3つある

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

3つの点数を変更してみる
3つの点数を変更してみる
  • エクセルのセル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 CaseIfElseIfよりもコードが見やすい
条件が1~3個で異なる変数もあるIfまたは
IfElseIf
OrAndも活用して柔軟に対応できる
条件を段階的に絞り込みたいネストIf条件A→B→Cと、順を追って絞り込める

同じ変数を何度も使うならSelect Case文、条件を段階的に絞りこむならネストIf文、それ以外はIf文を使うと覚えておきましょう。

実務でよく使うIf文3選

ここからは実務でよく使われるIf文をご紹介します。

コピーしてそのまま使えますが、状況に応じてコードを変更してください。

セルの値を判定して背景色を変える

点数が60点未満のセルを自動で赤くする例です。

ForNextで繰り返し処理をしています。

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行のB列を参照している
4~13行のB列を参照している
  1. 行の範囲を変更したい:作例では4~13行を繰り返し処理
  2. 列番号を変更したい:作例では2列目を参照
  3. 色を変更したい:作例では赤を使用

繰り返し処理と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セルの内容を重複チェック
D1セルの内容を重複チェック
  1. 検索するセルを変更したい:作例ではD1を指定
  2. 重複チェックする範囲を変更したい:作例では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文が反応しないのはなぜですか?

主な原因は次の3つです。

  1. End Ifの書き忘れ
  2. セル内の数字を判定する場合に、文字列が入っている
  3. AndOrの優先順位ミスやElseIfの条件順序のミス

特に多いのは3番です。以下の章をご参照ください。

「論理演算子」の使い分けがIf文の完成度を高める

If文の複数条件を使おう!3つ以上の条件もOK

VBAで処理を行わない方法はありますか?

If文で条件を満たしたときの処理に何も書かなければ、処理をスキップできます。

以下のサンプルコードをご参照ください。

Public Sub 空白を調べる()

    If Not IsEmpty(Range("B4").Value) Then
        '何もしない
    Else
        MsgBox "空白セルです"
    End If

End Sub

If文をマスターしてVBAをレベルアップ!

エクセルVBAのIf文を使った条件に応じた処理の自動化について解説しました。

演算子やネスト、Select Case文を組み合わせることで、複雑な条件分岐でも対応できるようになります。

それではポイントのおさらいです。

おさらい
  1. IfEnd Ifはセット
  2. 複数条件はElseIfを活用。条件は範囲の狭い順に書く
  3. 論理演算子AndOrより先に評価される
  4. 同じ変数を4回以上比較するならSelect Case文を活用

まずは基本のIf文から試して、徐々にElseIfやSelect Case文にチャレンジしてみましょう!

また、VBAの基本を知ることで、If文の活用の幅がさらに広がります。

以下の記事もぜひご参照ください。

エクセルマクロの基礎をゼロから学ぶ!有効化やボタン設置!

よかったらシェアしてね!
  • URLをコピーしました!
目次