【プログラミング】ExcelVBAのIF文で条件判定して処理を分岐する方法

プログラミング
ホーム»プログラミング» 【プログラミング】ExcelVBAのIF文で条件判定して処理を分岐する方法

【ExcelVBA】IF[条件式]than~Elseを使った条件分岐処理の書き方

ExcelVBAにおいて条件によって処理を分けたい時にIF文を使います。シンプルな2択の条件分岐処理からandやor、notなどの論理演算子を組み合わせた複雑な条件を指定した書き方で処理を分けることができます。

ExcelのIF関数同様にVBAで条件分岐にて処理を分けたい時に使える基本の構文について、複数分岐や論理演算子や入れ子(ネスト)にした書き方を紹介しています。

IF文を使ったVBAコードも掲載しておきますのでコピーして動作を確認頂いたり、カスタマイズしてご自身の環境に合わせてお使いいただけます。

【ExcelVBA】IF[条件式]than~Elseの基本構文

ExcelVBAの条件分岐処理のIFを使った基本構文は以下となります。

Elseがない場合の基本構文
If 条件式 Then
        条件に一致した場合に実行したい処理
End If
Elseがある場合の基本構文
If 条件式 Then
        条件に一致した場合に実行したい処理
else
        条件に一致しない場合に実行したい処理
End If

ExcelVBAのIF文では必ず末尾に「End If」を書かないとエラーとなります。

【ExcelVBA】IF[条件式]than~Elseの基本構文サンプルコード

構文に基づいてサンプルコードを紹介します。

IF[条件式]than~Elseの基本構文: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なので必ず条件に一致する処理が実行されます。

Elseがない場合のサンプルコードの実行結果

ExcelVBA-IF文実行結果1

Elseを書いておらず条件式で不一致となれば何も処理が実行されません。

IF[条件式]than~Elseの基本構文: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の処理となります。

Elseがある場合のサンプルコードの実行結果

ExcelVBA-IF文実行結果2

IF文の条件分岐のイメージ

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

ExcelVBAのIF条件分岐イメージ
条件式の判定にて一致する場合はTRUEの処理へ、不一致の場合はFALSEの処理となる

【ExcelVBA】IF[条件式]than~Elseを使った複数の条件分岐処理の書き方

IF[条件式]than~ElseIf~Else基本構文

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

ElseIf 条件式 Then

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

IF[条件式]than~ElseIf~Else基本構文サンプルコード

Sub 複数の条件分岐処理使ったif文の書き方()

    Dim i As Integer
    i = 2
    
    Debug.Print i
    
    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[条件式]than~ElseIf~Else基本構文サンプルコードの実行結果

ExcelVBA-IF文実行結果3

IF文で複数の条件分岐のイメージ

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

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

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

【ExcelVBA】IF文の条件式で使える演算子の書き方

ExcelVBAのIF文条件式で使える演算子は以下のとおりです。

【ExcelVBA】IF文の条件式で使用可能な比較演算子

演算子の書き方意味
If A>B ThenAはBよりも大きい
If A<B ThenAはBより小さい
If A>=B ThenAはB以上 ※以上の場合は同じ値も含む
If A<=B ThenAはB以下 ※以下の場合は同じ値も含む
If A=B ThenAとBは同じ
If A<>B ThenAとBは同じではない
※以上・以下の比較演算子では>(大なり)、<(小なり)は=の左側に書きます。

【ExcelVBA】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文で比較演算子使ったサンプルコードの実行結果

ExcelVBA-IF文実行結果4

【ExcelVBA】IF文の条件式で使用可能な論理演算子

演算子の書き方意味
If A And B ThenAとBの両方を満たす
If A Or B ThenAかBかいずれかを満たす
If Not A ThenAではない

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

IF文で論理演算子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

IF文で論理演算子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

【ExcelVBA】IF文の入れ子(ネスト)について

IF文中にIF文を書き込むことをIF文の入れ子(ネスト)と呼び、条件に一致した中から更に条件を絞り込みたい場合などに使います。

IF文の入れ子(ネスト)は以下のように書き方やサンプルコードを紹介します。

【ExcelVBA】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文の入れ子(ネスト)にした場合の条件分岐イメージ

If 条件式1 Then 処理A (If 条件式2 Then 処理B Else 処理C) Else 処理D

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

【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未満であるかの判定をしています。

IF文でAndと比較演算子を使って数値の範囲を条件のイメージ

50以上100未満の例

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

IF文で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よりも大きいかの条件を指定しています。

IF文でOrと比較演算子を使って数値の範囲を条件のイメージ

25より小さいまたは75よりも大きいの例

IF文条件25より小さいまたは75よりも大きい

IF文を入れ子(ネスト)にして実践的な条件式にする使い方

IF文を入れ子(ネスト)にした条件式で判定してセルに値を入力してみます。
サンプルとして以下の表を使って条件判定と判定結果に応じた処理を実行してみます。

商品リストに在庫数と月間の平均販売数が入力されていたとします。
この表で発注の緊急度をExcelVBAのIf文で条件判定し発注フラグの列に記入する処理を実行します。

緊急度は低いものから順に「記入なし」→「要観察」→「要注意」→「注意」→「至急!」です。

Sub if文の実践編3()
'IF文を入れ子にして複数条件判定をする
    
    If ActiveSheet.Cells(2, 3).Value <= 0 Then
        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

解説

[3行目]
・条件式:A商品の在庫が0以下であるかを判定
・処理:発注フラグセルには「至急!」を記入し、セル色を赤色に変更

[7~8行目]
・条件式:A商品の在庫を平均販売数で割った値が何パーセントかを計算し、結果が100%以上150%未満かを判定
・処理:発注フラグセルに「要観察」を記入、セル色を黄色に変更。

[11~12行目]
・条件式:A商品の在庫を平均販売数で割った値が何パーセントかを計算し、結果が50%以上100%未満かを判定
・処理:発注フラグセルに「要注意」を記入、セル色を薄いオレンジに変更。

[15~16行目]
・条件式:A商品の在庫を平均販売数で割った値が何パーセントかを計算し、結果が1%以上50%未満かを判定
・処理:発注フラグセルに「注意」を記入、セル色をオレンジに変更。

コード量が多くなる、繰り返しなど他の要素が入るためサンプルコード上はA商品の行のみに限定したコードです。

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

※各商品ごとに在庫数と平均販売数/月(個)を判定して発注フラグを立てています。

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

コメント

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