\Excelショートカット集もらえる/
【VBA入門】条件分岐 |Ifステートメントを完全解説
VBAを使用して条件に基づいた処理を行うためには、ifステートメントを理解することが不可欠です。ifステートメントは、式で表した条件に当てはまるかどうかを判断し、判断した結果に応じて異なる処理を実行します。この記事では、VBAのifステートメントについて詳しく説明します。
- 条件に応じて処理内容が変わるマクロを作成したい
- 3つ以上の条件分岐が発生するマクロを作成したい
Ifステートメントとは?
ifステートメントとは、Excel VBAの文法のうちの1つです。正式名称は「if…then…elseifステートメント」と言いますが、長いので「ifステートメント」や「if構文」と呼ぶ人もいます。(この記事では「ifステートメント」と呼ぶことにします。)
条件分岐「Ifステートメント」でできること
「もし○○なら、これをして。でも、もし○○じゃなくて、△△なら、これをして。」
こんな指示をExcelの中で使いたいんだけどな・・って思ったことが一度はあると思います。
その悩みを解決してくれるのが、Ifステートメントです。Ifステートメントを使うと、条件によって異なる処理を実行するよう指示することができます。
Ifステートメントの構文は以下の通りです。
If 条件式1 [ Then ]
[ 条件式1に当てはまる場合の処理内容 ]
[ ElseIf 条件式2 [ Then ]
[ 条件式2に当てはまる場合の処理内容] ]
[ Else
[ いずれの条件式にも当てはまらない場合の処理内容 ] ]
End If
[ ]の内側は省略可能です。このままだと分かりにくいため、身近な例に置き換えてみましょう。
例えば、
「寒い日はセーターを着て、暑い日は半袖シャツを着て、それ以外の日は長袖シャツを着て下さい」
という内容をExcelに伝えたいとしましょう。
この内容をifステートメント ”っぽく” 書くと、次のようになります。
もし 寒い日 なら
セーターを着る
それ以外で もし 暑い日 なら
半袖シャツを着る
それ以外は
長袖シャツを着る
以上
「寒い日」と「暑い日」が条件、「セーターを着る」「半袖シャツを着る」「長袖シャツを着る」が処理内容に相当します。
さらに、実際のIfステートメントを用いると、次のように書くことができます。
If 寒い日 Then
セーターを着る
ElseIf 暑い日 Then
半袖シャツを着る
Else
長袖シャツを着る
End If
「もし」「それ以外」「なら」「以上」がそれぞれ近い意味の英語に置き換えられていますね。
これにより、Excelは条件に当てはまるかどうかを上から順に確認し、確認した結果に応じて何を着るのか決めることができます。
また、Ifステートメントにおいて、条件は文章ではなく比較演算子や論理演算子を用いた条件式で表します。
それぞれの種類と意味は下表のとおりです。
比較演算子 | 意味 | 例 | 例の意味 |
---|---|---|---|
= | 等しい | A=100 | Aは100と等しい |
<> | 等しくない | A<>100 | Aは100と等しくない |
< | より小さい | A<100 | Aは100より小さい |
> | より大きい | A>100 | Aは100より大きい |
<= | 以下 | A<=100 | Aは100以下 |
>= | 以上 | A>=100 | Aは100以上 |
論理演算子 | 意味 | 例 | 例の意味 |
---|---|---|---|
And | かつ | A>100 And B>100 | Aは100より大きい かつ Bは100より大きい |
Or | または | A>100 Or B>100 | Aは100より大きい または Bは100より大きい |
Not | ではない | Not A>100 | Aは100より大きくない |
Ifステートメントにおける比較演算子や論理演算子の使い方については、次章以降で詳しく解説します。
【基礎】Ifステートメントの基本的な使い方
それでは実際に例題を解きながら、Ifステートメントを使用したマクロを作成してみましょう。
条件が1つの場合①:もし○○なら××
以下の内容を実行するマクロを作成して下さい。
- 今年度受注件数が目標受注件数を上回る場合、F5セルに文字列 ”達成” を表示する
- 1つ目の条件に当てはまらない場合は何も実行しない
Sub 基礎例題1()
If Range("E5").Value > Range("D5").Value Then
Range("F5").Value = "達成"
End If
End Sub
必ず「If」と「End If」ではさむ!
基礎例題1において、やりたいことを条件と処理内容に分けて考えると、次のようになります。
条件:今年度受注件数が目標受注件数を上回る
処理内容:F5セルに文字列 ”達成” を表示する
これらを文章ではなくIfステートメントっぽく書いてみると、
もし 今年度受注件数 >目標受注件数 なら
F5セルの値 = "達成"
以上
となります。
後は、実際のIfステートメントやRangeオブジェクトに置き換えてあげると完成です。
また、Ifステートメントを書いた後は必ず「End If」を記述し、条件分岐の処理内容を「If」と「End If」で挟んであげるようにしましょう。
条件が1つの場合②:もし○○なら××、それ以外は…
以下の内容を実行するマクロを作成して下さい。
- 今年度受注件数が目標受注件数を上回る場合、F9セルに文字列 “達成” を表示する
- 1つ目の条件に当てはまらない場合、F9セルに文字列 “未達成” を表示する
Sub 基礎例題2()
If Range("E9").Value > Range("D9").Value Then
Range("F9").Value = "達成"
Else
Range("F9").Value = "未達成"
End If
End Sub
条件式に当てはまらない場合の処理は「Else」で始める!
基礎例題2において、やりたいことを条件と処理内容に分けると考えると、次のようになります。
条件1:今年度受注件数が目標受注件数を上回る
処理内容1:F9セルに文字列 ”達成” を表示する
条件2:条件1に当てはまらない
処理内容2:F9セルに文字列 ”未達成” を表示する
これらを文章ではなくIfステートメントっぽく書いてみると、
もし 今年度受注件数 >目標受注件数 なら
F9セルの値 = "達成"
それ以外は
F9セルの値 = "未達成"
以上
となります。
後は、実際のIfステートメントやRangeオブジェクトに置き換えてあげると完成です。
この時、「それ以外は…」に続く処理内容を「Else…」で始めるのがポイントです。
条件が2つ以上の場合①:もし○○なら××、△△ならば◻️◻️、それ以外は…
以下の内容を実行するマクロを作成して下さい。
- 今年度受注件数が40件を上回る場合、F13セルに文字列 “S” を表示する
- 1つ目の条件に当てはまらないが、今年度受注件数が目標受注件数を上回る場合、F13セルに文字列 “A” を表示する
- 1つ目の条件と2つ目の条件の両方に当てはまらない場合、F13セルに文字列 “B” を表示する
Sub 基礎例題3()
If Range("E13").Value > 40 Then
Range("F13").Value = "S"
ElseIf Range("E13").Value > Range("D13").Value Then
Range("F13").Value = "A"
Else
Range("F13").Value = "B"
End If
End Sub
2つ目以降の条件式は「ElseIf」で始める!
基礎例題3において、やりたいことを条件と処理内容に分けると考えると、次のようになります。
条件1:今年度受注件数が40件を上回る
処理内容1:F13セルに文字列 “S” を表示する
条件2:1つ目の条件に当てはまらないが、今年度受注件数が目標受注件数を上回る
処理内容2:F13セルに文字列 “A” を表示する
条件3:1つ目の条件と2つ目の条件の両方に当てはまらない
処理内容3:F13セルに文字列 “B” を表示する
これらを文章ではなくIfステートメントっぽく書いてみると、
もし 今年度受注件数 > 40 なら
F13セルの値 = "S"
それ以外で もし 今年度受注件数 >目標受注件数 なら
F13セルの値 = "A"
それ以外は
F13セルの値 = "B"
以上
となります。
後は、実際のIfステートメントやRangeオブジェクトに置き換えてあげると完成です。
この時、2つ目以降の条件式は「ElseIf」で始めるのがポイントです。
条件が2つ以上の場合②:もし○○かつ△△なら××、それ以外は…
以下の内容を実行するマクロを作成して下さい。
- 今年度受注件数が目標受注件数を上回り、かつ、今年度受注件数が昨年度受注件数の1.5倍より多い場合、
F17セルに文字列 “〇”を表示する - 1つ目の条件に当てはまらない場合、F17セルに文字列 “×” を表示する
Sub 基礎例題4()
If Range("E17").Value > Range("D17").Value And Range("E17").Value > Range("C17").Value * 1.5 Then
Range("F17").Value = "〇"
Else
Range("F17").Value = "×"
End If
End Sub
条件を組み合わせるときは論理演算子!
基礎例題4において、やりたいことを条件と処理内容に分けると考えると、次のようになります。
条件1:今年度受注件数が目標受注件数を上回り、かつ、今年度受注件数が昨年度受注件数の1.5倍より多い
処理内容1:F17セルに文字列 “〇”を表示する
条件2:1つ目の条件に当てはまらない
処理内容2:F17セルに文字列 “×” を表示する
これらを文章ではなくIfステートメントっぽく書いてみると、
もし 今年度受注件数 >目標受注件数 かつ 今年度受注件数 > 昨年度受注件数の1.5倍
F17セルの値 = "〇"
それ以外は
F17セルの値 = "×"
以上
となります。
後は、実際のIfステートメントやRangeオブジェクトに置き換えてあげると完成です。
この時、「かつ」で繋がる2つの条件は論理演算子「And」で繋げるのがポイントです。
【実践】Ifステートメントの実務使用例
ここからは基礎例題で解説した内容を踏まえて、Ifステートメントが実務の場面でどの様に使用されるのか解説します。
会員ポイントを自動計算する例
以下の内容を実行するマクロを作成して下さい。
- 獲得したポイント数をE13セルに表示する
- 獲得ポイント数は合計金額が5000円以上の場合は合計金額の10%、5000円未満の場合は合計金額の5%とする
- ポイントが付与されるのは会員ランクが”ゴールド”の会員のみとする。
- 会員ランクが”ゴールド”以外の場合、獲得ポイント数は表示しない
Sub 実践例題1()
If Range("E5").Value = "ゴールド" Then
If Range("E11").Value >= 5000 Then
Range("E13").Value = Range("E11").Value * 0.1
Else
Range("E13").Value = Range("E11").Value * 0.05
End If
End If
End Sub
階層構造はネスト(入れ子)を使う!
実践例題1において、やりたいことを条件と処理内容に分けると考えると、次のようになります。
条件1:会員ランクが”ゴールド”の会員
条件1-1:合計金額が5000円以上
処理内容1-1:獲得ポイント数は合計金額の10%
条件1-2:合計金額が5000円未満
処理内容1-2:獲得ポイント数は合計金額の5%
条件1に当てはまる場合、更に条件1-1と条件1-2に階層分岐するのがポイントです。
論理演算子を使用してコードを書くこともできますが、条件分岐が階層構造になっている場合は、Ifステートメントのネスト(入れ子)を使うのが便利です。
試しにネストを使ってIfステートメントっぽく書いてみましょう。
もし E5セルの値 = "ゴールド" なら
もし E11セルの値 >= 5000 なら
E13セルの値 = E11セルの値の10%
それ以外は
E13セルの値 = E11セルの値の5%
以上
以上
ネストを使うと、条件分岐の先に更に条件分岐を設定することができます。
後は、必要な箇所をIfステートメントやRangeオブジェクトに置き換えてあげると完成です。
ネストはとても便利ですが、ネストを何重にも設定する(ネストを深くする)と、構造が複雑になり、作成したマクロの内容が理解しにくくなります。また、ネストを深くすると、マクロの実行速度が遅くなったり、メンテナンスが大変になることもあります。
ネストを使用する時は必要以上にネストを深くしないようにしましょう。
他のVBA構文と組み合わせた例
最後の例題は、Ifステートメントと別の構文を組み合わせた発展的内容です。
For~Nextステートメントによる繰り返し処理との組み合わせ技になるので、実務で重宝すること間違いなしです。
以下の内容を実行するマクロを作成して下さい。
- シート(実践例題2-1)に記載されたリストのうち、配属支店が”東京本社”の社員の氏名だけシート(実践例題2-2)に転記する
- 転記する氏名はシート(実践例題2-2)のC5セルから順に、列方向につめて転記する
Sub 実践例題2()
Dim i
Dim j
j = 0
For i = 5 To 24
If Sheets("実践例題2-1").Range("B" & i).Value = "東京本社" Then
Sheets("実践例題2-2").Range("C" & 5 + j).Value = Sheets("実践例題2-1").Range("C" & i).Value
j = j + 1
End If
Next i
End Sub
条件分岐と繰り返し処理を組み合わせる!
シート(実践例題2-1)の行番号を変数i、シート(実践例題2-2)の行番号を変数jとして宣言した後、条件分岐による転記処理をC5セルからC24セルまで繰り返しています。
繰り返し処理については別の記事で解説する予定ですが、「どうしても今知りたい!」という方は、以下の動画をご覧になるか、ユースフルのExcelPro講座VBAコースをぜひご確認ください。
まとめ
今回は、条件によって処理の内容を分岐させられるIfステートメントについて解説しました。
今回の重要ポイントは3つです。
- 比較演算子と論理演算子をうまく活用する
- 条件分岐の階層構造は、ネスト(入れ子)を使う
- いきなりコードを書こうとせずに、条件と処理内容を整理する
特に最後のポイントは、当たり前のことに思えますがとても重要なことです。実務では、複数の条件が重なることが多く、頭からコードを書くことが難しくなります。いきなりIfステートメントを書くのが難しいと感じた場合は、実行内容を条件と処理内容に整理してから、まずは、ifステートメント ”っぽく” 書いてみてください。他の人が見てわかりやすいコードを記載することも意識できればさらにいいですね。
「もっとVBAを学びたい」
「わからないところは質問しながら体系的に学びたい」
そんな方はぜひユースフルのExcelPro講座VBAコースをご確認ください。現役エンジニアが開発、MicrosoftMVPが監修した実務直結のオンライン動画講座です。これさえ受講すれば、コードを書くたびにつまづいて検索して時間を消費してしまう・・・そんな状況がガラっと変わります!