エクセルVBAのIf文で条件を判定して分岐するマクロをつくる方法

vba

INDEX

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

エクセルVBAではIf文をつかって条件分岐ができます。
単純な2択の条件分岐処理から、条件式をAndOrNotなどの論理演算子を複雑に組み合わせたもまで実装可能です。これによりユーザーや状況によって処理を分岐させたプログラムを作ることができます。

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

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

If[条件式]than~Elseの基本構文

エクセルVBAの条件分岐処理のIfを使った基本構文は以下となります。

Elseがない場合の基本構文

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

Elseがある場合の基本構文

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

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

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

Elseは、If文で条件判定したもの以外だったときに通るルートとおぼえると良いね!

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

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

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

独学の学習効率でお悩みの人必見!
<動画学習見放題サービス>

初心者にやさしいチューターなら今すぐにはじめられる

オンラインで学習したい
プログラミングで副業をはじめたい
パソコン・エクセルの学習をしたい

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 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[条件式]than~ElseIf~Else基本構文サンプルコードの実行結果

ExcelVBA-IF文実行結果3

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

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

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

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

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

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

If文の条件式で使える演算子の書き方

エクセルVBAのIf文条件式で使える演算子は以下のとおりです。

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は同じではない
※以上・以下の比較演算子では>(大なり)、<(小なり)は=の左側に書きます。

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

エクセルVBA:If文で比較演算子使ったサンプルコードの実行結果

ExcelVBA-IF文実行結果4

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

If文の入れ子(ネスト)について

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

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

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条件分岐イメージ(ネスト)

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

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をコピーしました