※本ブログのページには広告主との提携による広告や宣伝、プロモーションが含まれます。当ブログを経由しての商品の購入や、サービス申し込みが発生すると、それらの提携企業からの成果報酬を受けとる場合があります。

エクセルVBA|Ifステートメントで条件分岐するマクロをつくる方法

Contents

Ifステートメントを使った条件分岐について

条件分岐とは、プログラムが実行しているなかで、その時点の状態や状況におうじてそのあとの処理を変えることを言います。

Ifはエクセルの関数でもよく使われるものであり、利用頻度の高いものですが、これは条件分岐がわたしたちの日常生活でもよくおこなわれているためです。

たとえば、あなたは信号が「赤」のときは止まる。「青」のときはわたる。という行動をほぼ無意識にしているかと思いますが、これも条件におうじて処理(止まるor わたる)を分岐しています。

エクセル関数と同様にVBAでもIfステートメントをつかって条件を判定し、処理を分岐することができます。

さきほど例にあげた「赤」なら止まる。「青」ならわたるのような単純な2択の処理から、3択以上の多くの分岐論理演算子である”And”や”Or”などを利用した条件の組み合わせや、条件式を入れ子にする(ネスト)など、IFステートメントの扱いかたについてマクロのサンプルとともに解説していきます。

Ifステートメントで条件分岐するとき処理の書きかた

Ifステートメントの基本構文

エクセルVBAの条件分岐処理で利用するIfステートメントの基本構文は以下となります。

If 条件式 Then
  条件に一致した場合に実行したい処理
End If

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なし)の実行結果

ExcelVBA-IF文実行結果1

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あり)の実行結果

ExcelVBA-IF文実行結果2

Elseは、条件判定したものに当てはまらなかったときに実行する使いかたができるよ。

Ifステートメントを使ったマクロ実行時の条件分岐イメージ

If 条件式 Then 処理A Else 処理B 

ExcelVBAのIF条件分岐イメージ
条件式の判定にて一致する場合はTRUEの処理へ、不一致の場合はFALSEの処理となる
独学でプログラミングをはじめてみたけど、このままの学習方法に不安を感じているのなら、
オンラインスクールで現役エンジニアのサポートがあるテックアカデミーがおすすめ。
スキマ時間に学べて仕事も保証。必ず副業、始められます。まずは無料でプログラミング体験

Ifステートメントで複数の条件分岐

Ifステートメントで複数の条件分岐にはElseIfを使う

If[条件式]than~Elseの基本構文に以下を追加することで複数の条件分岐に対応可能です。

ElseIf 条件式 Then

If 条件式 Then
        条件Aに一致した場合に実行したい処理
ElseIf i = 2 Then
        条件Bに一致した場合に実行したい処理
Else
        MsgBox ("変数iは「" & i & "」なので条件に一致していない処理を実行中です。")
End If
ElseIfはIfとElseの間に追記していきます。

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番目の条件に一致した処理が実行されます。

ExcelVBA-IF文実行結果3

Ifステートメントを使ったマクロ実行時の複数条件分岐のイメージ

If 条件式1 Then 処理A ElseIf 条件式2 処理B Then Else 処理C

ExcelVBAのIF条件分岐イメージ(複数分岐)
条件式1にてFALSEなら条件式2の判定をするといった処理のながれです。
POINT

複数分岐の分岐において、条件式1と条件式2のどちらの条件にも一致する場合は、先に書いた分岐の処理(コード)が実行されます。

複数の条件分岐をするマクロをスマートに書くなら、SelectCase文をつかう方法もおすすめです。
SelectCase文は以下の記事で紹介しています。
独学だと中々スキルが身についた実感が湧かない。学習環境を見直してみませんか?

エクセルで繰り返しや転記作業で苦しい思いをした経験はありませんか?
今まで苦労してきたその作業を簡単なプログラムをおぼえるだけで解決できる可能性があります。
なるべくお金や時間をかけずにエクセルマクロVBAを習得したい人にはこちらの「1日速習講座」がおすすめです。

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番目の処理が実行されます。

ExcelVBA-IF文実行結果4

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を利用したサンプルコードの実行結果

ExcelVBA-IF文実行結果AND文をつかった実行結果

論理演算子のAndを利用したときの処理イメージ

If 条件式1 And 条件式2 処理A Then Else 処理B

ExcelVBAのIF条件分岐イメージ(ANDをつかった場合)
And条件では条件式1、条件式2どちらの結果もTRUEでない場合はFALSEの結果となります。

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を利用したサンプルコードの実行結果

ExcelVBA-IF文実行結果OR

論理演算子のOrを利用したときの処理イメージ

If 条件式1 Or 条件式2 処理A Then Else 処理B

ExcelVBAのIF条件分岐イメージ(OR)

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を利用したサンプルコードの実行結果

ExcelVBA-IF文実行結果NOT

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

ExcelVBAのIF条件分岐イメージ(ネスト)

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未満の例

IF文条件50以上100未満イメージ

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文条件25より小さいまたは75よりも大きい

Ifステートメントの入れ子(ネスト)を利用した実践例

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%未満かを判定
・処理:発注フラグセルに「注意」を記入、セル色をオレンジに変更。

コード量が多くなるため、サンプルコード上はA商品の行のみに限定した解説です。

If文を入れ子(ネスト)にして実践的な条件式にするサンプルコードで実現したい結果としては以下のとおりです。

If文をつかったマクロで条件判定の結果を出力後の表
※各商品ごとに在庫数と平均販売数/月(個)を判定して発注フラグを立てています。

コダマのもりブログはにほんブログ村に登録しています。
この記事が役に立ったと感じていただけた人は是非フォローお願いします。
にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村
PVアクセスランキング にほんブログ村 コダマのもりブログ - にほんブログ村

コメント

タイトルとURLをコピーしました