Ifステートメントを使った条件分岐について
条件分岐とは、プログラムが実行しているなかで、その時点の状態や状況におうじてそのあとの処理を変えることを言います。
Ifはエクセルの関数でもよく使われるものであり、利用頻度の高いものですが、これは条件分岐がわたしたちの日常生活でもよくおこなわれているためです。
たとえば、あなたは信号が「赤」のときは止まる。「青」のときはわたる。という行動をほぼ無意識にしているかと思いますが、これも条件におうじて処理(止まるor わたる)を分岐しています。
エクセル関数と同様にVBAでもIfステートメントをつかって条件を判定し、処理を分岐することができます。
さきほど例にあげた「赤」なら止まる。「青」ならわたるのような単純な2択の処理から、3択以上の多くの分岐、論理演算子である”And”や”Or”などを利用した条件の組み合わせや、条件式を入れ子にする(ネスト)など、IFステートメントの扱いかたについてマクロのサンプルとともに解説していきます。
条件分岐はほとんどのプログラミング言語で使うので必須の内容だよ。
Ifステートメントで条件分岐するとき処理の書きかた
Ifステートメントの基本構文
エクセルVBAの条件分岐処理で利用するIfステートメントの基本構文は以下となります。
Elseがない場合の基本構文
If 条件式 Then
条件に一致した場合に実行したい処理
End If
Elseがある場合の基本構文
If 条件式 Then
条件に一致した場合に実行したい処理
else
条件に一致しない場合に実行したい処理
End If
さいごのEnd Ifを忘れるとエラーになるよ。
Ifステートメントを使ったサンプルコード
構文に基づいてサンプルコードを紹介します。
Ifステートメントを使ったサンプルコード(Elseなし)
Sub if文の書き方について()
Dim i As Integer
i = 1
Debug.Print i
If i = 1 Then
MsgBox ("条件に一致した処理を実行中です。")
End If
End Sub
変数iを宣言して、iに数値の1を代入してIf文で条件判定をしています。
数値や文字列などを直接指定した、いわゆるリテラル値での条件判定も可能です。しかし、実用的なマクロにおける条件判定では、変数に代入された値を判定することが一般的になりますので、サンプルコードでも変数に代入された値を判定するコードにしています。
サンプルの場合だと、変数のiには数字の1が入っているから、条件判定で必ず一致するね!
Ifステートメントを使ったサンプルコード(Elseなし)の実行結果
Ifステートメントを使ったサンプルコード(Elseあり)
Sub if文の書き方について()
Dim i As Integer
i = 2
If i = 1 Then
MsgBox ("条件に一致した処理を実行中です。")
Else
MsgBox ("変数iは「" & i & "」なので条件に一致していない処理を実行中です。")
End If
End Sub
Elseは、Ifの条件式に一致しない場合に処理が実行されます。使い方のイメージとしては、どの条件にも当てはまらなかった時はこういった処理をしたいを想定して書くと良いでしょう。
サンプルコードの場合、変数iに2を代入しているので必ずElseの処理となります。
Ifステートメントを使ったサンプルコード(Elseあり)の実行結果
Elseは、条件判定したものに当てはまらなかったときに実行する使いかたができるよ。
Ifステートメントを使ったマクロ実行時の条件分岐イメージ
If 条件式 Then 処理A Else 処理B
オンラインスクールで現役エンジニアのサポートがあるテックアカデミーがおすすめ。
スキマ時間に学べて仕事も保証。必ず副業、始められます。まずは無料でプログラミング体験
Ifステートメントで複数の条件分岐
Ifステートメントで複数の条件分岐にはElseIfを使う
If[条件式]than~Elseの基本構文に以下を追加することで複数の条件分岐に対応可能です。
If 条件式 Then
条件Aに一致した場合に実行したい処理
ElseIf i = 2 Then
条件Bに一致した場合に実行したい処理
Else
MsgBox ("変数iは「" & i & "」なので条件に一致していない処理を実行中です。")
End If
Ifステートメントで複数の条件分岐に対応したサンプルコード
Sub 複数の条件分岐処理使ったif文の書き方()
Dim i As Integer
i = 2
Debug.Print ia
If i = 1 Then
MsgBox ("1番目の条件に一致した処理を実行中です。")
ElseIf i = 2 Then
MsgBox ("2番目の条件に一致した処理を実行中です。")
Else
MsgBox ("変数iは「" & i & "」なので条件に一致していない処理を実行中です。")
End If
End Sub
ElseIf 条件式を含めて変数の値を判定するコードとなります。
サンプルコードの場合は変数iに2を代入していることから必ず2番目の条件に一致した処理が実行されます。
Ifステートメントで複数の条件分岐に対応したサンプルコードの実行結果
Ifステートメントを使ったマクロ実行時の複数条件分岐のイメージ
If 条件式1 Then 処理A ElseIf 条件式2 処理B Then Else 処理C
SelectCase文は以下の記事で紹介しています。
Ifステートメントの演算子をつかった判定式
エクセルVBAのIf文条件式で使える演算子は以下のとおりです。
Ifステートメントで利用できる比較演算子
演算子をつかったIfステートメントの書きかた | 意味 |
---|---|
If A>B Then | AはBよりも大きい |
If A<B Then | AはBよりも小さい |
If A>=B Then | AはB以上 ※以上の場合は同じ値も含む |
If A<=B Then | AはB以下 ※以下の場合は同じ値も含む |
If A=B Then | AとBは同じ |
If A<>B Then | AとBは同じではない |
Ifステートメントで比較演算子を利用したサンプルコード
変数iに代入された値が50よりも小さいか、同じか、大きいかを判定して処理を分岐するコード
複数の分岐処理で上から順に変数iが50よりも小さい数値であるかどうか。次に変数iが50であるかどうか。
最後に変数iが50よりも大きい数値であるかどうかを判定します。
Sub 比較演算子使ったif文の書き方()
Dim i As Integer
i = 50
Debug.Print i
If i < 50 Then
MsgBox ("iが50よりも小さいため処理を実行中です。")
ElseIf i = 50 Then
MsgBox ("iが50であるため処理を実行中です。")
ElseIf i > 50 Then
MsgBox ("iが50よりも大きいため処理を実行中です。")
Else
MsgBox ("どれにも当てはまらないため処理を実行中です。")
End If
End Sub
サンプルコードの場合は変数iに50が代入されていることから上から2番目の処理が実行されます。
Ifステートメントで比較演算子を利用したサンプルコードの実行結果
Ifステートメントで利用できる論理演算子
演算子をつかったIfステートメントの書きかた | 意味 |
---|---|
If A And B Then | AとBの両方を満たす |
If A Or B Then | AかBかいずれかを満たす |
If Not A Then | Aではない |
Ifステートメントで論理演算子のAndを利用したサンプルコード
If文の条件式でAndを使って〇〇かつ▲▲であるを判定する時の書き方
Sub 論理演算子使ったif文の書き方()
Dim i As Integer
Dim j As String
i = 30
j = "東京"
If i = 30 And j = "東京" Then
MsgBox ("And条件が一致したため処理を実行中です。")
Else
MsgBox ("どれにも当てはまらないため処理を実行中です。")
End If
End Sub
変数iの値と変数jの値を条件式で判定しています。
サンプルコードでは変数「 i 」は30であることかつ、変数「 j 」が東京であるといったAnd条件に一致している処理となります。
※And条件なので、変数iもしくは変数jのどちらかが条件式と異なれば不一致となります。
Ifステートメントで論理演算子のAndを利用したサンプルコードの実行結果
論理演算子のAndを利用したときの処理イメージ
If 条件式1 And 条件式2 処理A Then Else 処理B
Ifステートメントで論理演算子のOrを利用したサンプルコード
If文の条件式でOrを使って〇〇または▲▲であるを判定する時の書き方
Sub 論理演算子使ったif文の書き方()
Dim i As Integer
Dim j As String
i = 1
j = "東京"
If i = 30 Or j = "東京" Then
MsgBox ("Or条件が一致したため処理を実行中です。")
Else
MsgBox ("どれにも当てはまらないため処理を実行中です。")
End If
End Sub
変数iの値が30である。または変数jの値が東京である、そのどちらか一方の条件に一致すればTRUEとなります。
サンプルコードでは変数「 i 」に1を代入しているので条件不一致でFALSEですが、変数「 j 」に東京が代入されているため判定結果はTRUEとなります。
Ifステートメントで論理演算子のOrを利用したサンプルコードの実行結果
論理演算子のOrを利用したときの処理イメージ
If 条件式1 Or 条件式2 処理A Then Else 処理B
Ifステートメントで論理演算子のNotを利用したサンプルコード
If文の条件式でNotを使って〇〇ではない判定をする時の書き方
Sub 論理演算子使ったif文の書き方() Dim i As String i = "東京" If Not i = "神奈川" Then MsgBox ("Not条件が一致したため処理を実行中です。") Else MsgBox ("どれにも当てはまらないため処理を実行中です。") End If End Sub
変数iの値が神奈川県かどうかの条件判定をするコードとなります。サンプルコードでは、変数iに東京が代入されているため神奈川ではない。の条件に一致していることから判定結果はTRUEとなります。
Ifステートメントで論理演算子のNotを利用したサンプルコードの実行結果
Ifステートメントの入れ子(ネスト)について
Ifステートメントの入れ子(ネスト)とは
IfステートメントのなかにIfステートメントを書くことです。
条件式1の判定でTrueとなった場合、さらに条件式2の判定をする場合などに利用し、さらに条件を絞りこみたいときに利用ができます。
ただし、入れ子(ネスト)をいくつも重ねることは選択肢が多くなってしまい、プログラムを読みとることが難しくなってしまう傾向があります。論理演算子のAndなどをつかって同様の判定ができるようであれば、入れ子(ネスト)が多くなり過ぎないように3つほどで留めておくことをおすすめします。
Ifステートメントの入れ子(ネスト)の書きかた
If 条件式1 Then 条件1に一致した場合に実行したい処理 If 条件式2 Then 条件2に一致した場合に実行したい処理 End If End If
If条件式1~End Ifの内側にさらにIf条件式2~End If(3行目~5行目)を書き込み入れ子にします。
Ifステートメントを入れ子(ネスト)にしたサンプルコード
Sub if文を入れ子にする書き方について() Dim i As Integer Dim j As String i = 1 j = "東京" If i = 1 Then MsgBox ("1つ目のIf条件に一致しました。" & vbCrLf & "内側のIFの判定に以降します。") If j = "東京" Then MsgBox ("2つ目のIf条件に一致しました。") Else MsgBox ("2つ目のIf条件に不一致です。") End If Else MsgBox ("1つ目のIf条件に不一致です。") End If End Sub
1つ目のIf条件式で変数iの値を判定しています。判定にてTRUEが返ってきたら処理を実行します。
その後、2つ目(内側)のIf条件式で判定として変数 j の値の判定をします。
サンプルコードの場合は変数 i は 1 で変数 j は東京となっているので、1つ目も2つ目どちらの条件式にもTRUEが返ってきます。
Ifステートメントを入れ子(ネスト)にしたサンプルコードの実行結果
左の画像がサンプルコードの7行目の処理、右の画像が9行目の処理となります。
サンプルの場合は何れも条件判定に一致しているパターンなので画像の処理結果となります。
入れ子(ネスト)にしたサンプルコード実行時の条件分岐イメージ
If 条件式1 Then 処理A (If 条件式2 Then 処理B Else 処理C) Else 処理D
Ifステートメントで複数の条件分岐マクロ(実践例)
Andと比較演算子で数値の範囲を条件に指定する
Sub if文の実践編() '比較演算子と論理演算子を用いて数値の範囲を条件指定する Dim i As Integer '任意の数値を入力するインプットボックスを使った処理 i = Application.InputBox("数値を入力してください。", "数値を入力", 50, Type:=1) If i < 50 Then MsgBox ("変数iは50より小さいです。") ElseIf i >= 50 And i < 100 Then MsgBox ("変数iは50以上100未満です。") ElseIf i >= 100 Then MsgBox ("変数iは100より大きいです。") Else MsgBox ("いずれも当てはまりません") End If End Sub
変数 i の値を判定するIf文ですが、実践レベルとしてよく使われるのは8行目の条件式です。
比較演算子の>=、<と論理演算子を合わせて変数 i の値が50以上~100未満であるかの判定をしています。
Andと比較演算子を組み合わせた数値の範囲のイメージ
50以上100未満の例
InputBoxの使い方については別の記事で紹介しています。
Orと比較演算子で数値の範囲を条件に指定する
Sub if文の実践編2() '比較演算子と論理演算子を用いて数値の範囲を条件指定する Dim i As Integer '任意の数値を入力するインプットボックスを使った処理 i = Application.InputBox("数値を入力してください。", "数値を入力", 50, Type:=1) Debug.Print i If i < 25 Or i > 75 Then MsgBox ("変数iは25より小さいか75より大きいです。") ElseIf i >= 25 And i <= 75 Then MsgBox ("変数iは25以上75以下です。") Else MsgBox ("いずれも当てはまりません") End If End Sub
変数iの値を判定するIf文ですが、こちらはOrを使った範囲指定となります。
サンプルコードの7行目で変数iの値が25より小さいか75よりも大きいかの条件を指定しています。
Orと比較演算子を組み合わせた数値の範囲のイメージ
25より小さいまたは75よりも大きいの例
Ifステートメントの入れ子(ネスト)を利用した実践例
If文を入れ子(ネスト)にした条件式で判定してセルに値を入力してみます。
サンプルとして以下の表を使って条件判定と判定結果に応じた処理を実行してみます。
商品リストに在庫数と月間の平均販売数が入力されていたとします。
この表で発注の緊急度をエクセルVBAのIf文で条件判定し発注フラグの列に記入する処理を実行します。
緊急度は低いものから順に「記入なし」→「要観察」→「要注意」→「注意」→「至急!」です。
Sub if文の実践編3() 'IF文を入れ子にして複数条件判定をする If ActiveSheet.Cells(2, 3).Value <= 0 Then'在庫が0以下の場合の時に分岐する処理 ActiveSheet.Cells(2, 6).Interior.ColorIndex = 3 ActiveSheet.Cells(2, 6) = "至急!" Else If (ActiveSheet.Cells(2, 3) / ActiveSheet.Cells(2, 4)) * 100 >= 100 And _ (ActiveSheet.Cells(2, 3) / ActiveSheet.Cells(2, 4)) * 100 < 150 Then ActiveSheet.Cells(2, 6).Interior.ColorIndex = 46 ActiveSheet.Cells(2, 6) = "要観察" ElseIf (ActiveSheet.Cells(2, 3) / ActiveSheet.Cells(2, 4)) * 100 >= 50 And _ (ActiveSheet.Cells(2, 3) / ActiveSheet.Cells(2, 4)) * 100 < 100 Then ActiveSheet.Cells(2, 6).Interior.ColorIndex = 45 ActiveSheet.Cells(2, 6) = "要注意" ElseIf (ActiveSheet.Cells(2, 3) / ActiveSheet.Cells(2, 4)) * 100 >= 1 And _ (ActiveSheet.Cells(2, 3) / ActiveSheet.Cells(2, 4)) * 100 < 50 Then ActiveSheet.Cells(2, 6).Interior.ColorIndex = 44 ActiveSheet.Cells(2, 6) = "注意" End If End If End Sub
~ コード解説 ~
If ActiveSheet.Cells(2, 3).Value <= 0 Then
・条件式:A商品の在庫が0以下であるかを判定
・処理:発注フラグセルには「至急!」を記入し、セル色を赤色に変更
If (ActiveSheet.Cells(2, 3) / ActiveSheet.Cells(2, 4)) * 100 >= 100 And _ (ActiveSheet.Cells(2, 3) / ActiveSheet.Cells(2, 4)) * 100 < 150 Then
・条件式:A商品の在庫を平均販売数で割った値が何パーセントかを計算し、結果が100%以上150%未満かを判定
・処理:発注フラグセルに「要注意」を記入、セル色を薄いオレンジに変更。
ElseIf (ActiveSheet.Cells(2, 3) / ActiveSheet.Cells(2, 4)) * 100 >= 50 And _ (ActiveSheet.Cells(2, 3) / ActiveSheet.Cells(2, 4)) * 100 < 100 Then
・条件式:A商品の在庫を平均販売数で割った値が何パーセントかを計算し、結果が50%以上100%未満かを判定
・処理:発注フラグセルに「要注意」を記入、セル色を薄いオレンジに変更。
ElseIf (ActiveSheet.Cells(2, 3) / ActiveSheet.Cells(2, 4)) * 100 >= 1 And _ (ActiveSheet.Cells(2, 3) / ActiveSheet.Cells(2, 4)) * 100 < 50 Then
・条件式:A商品の在庫を平均販売数で割った値が何パーセントかを計算し、結果が1%以上50%未満かを判定
・処理:発注フラグセルに「注意」を記入、セル色をオレンジに変更。
If文を入れ子(ネスト)にして実践的な条件式にするサンプルコードで実現したい結果としては以下のとおりです。
この記事が役に立ったと感じていただけた人は是非フォローお願いします。
にほんブログ村 |
コメント