【Excel/VBA】Ifを使った、複数条件をマスターする

前回、繰り返し処理について、記事を書きました。
【Excel/VBA】繰り返し処理をやってみる

今回は、その中に発生した「条件分岐」について、複数条件を実施してみたいと思います。

1.”If”を使った条件分岐の詳細

条件分岐をする際に”If”を使用しますが、その表現方法について、もう少し深く書いてみたいと思います。

  • 統合不等号を使用する
    = / < / >の三種類の記号を使って表現します。
    • 「=」
      └等しい
    • 「<」
      └(左側の値のほうが)小さい
    • 「>」
      └(左側の値のほうが)大きい
    • 「<=」
      └(左側の値のほうが)小さい、または等しい
    • 「>=」
      └(左側の値のほうが)大きい、または等しい
    • 「<>」
      └等しくない
  • 比較する値(等号/不等号記号の右側)の表現方法
    • 文字列を表現する
      →””(ダブルクォーテーション)で囲みます。
      ※セルの中身が「あいうえお」や、「東京都」等、文字
      Ex) Range("A1").Value = "東京都"
    • 「空白の場合」を表現する
      →””(ダブルクォーテーション)を二つ記載します。
      Ex) Range("A1").Value = ""
    • 「空白ではない(なんでもいいので、なにかしら値が入っている)」を表現する
      →不等号表現の後に、””(ダブルクォーテーション)を二つ記載します。
      Ex) Range("A1").Value <> ""
    • 数字を表現する
      →数字をそのまま記載します。
      Ex) Range("A1").Value = 100

2.複数の条件を表現する_01










このようなデータがあり、そこで、
「100点満点のテストで、80点以上はGreat、60点以上はGood、40点以上はOK、それ以外はFight!」
という条件の元、C列を埋めていきたいとします。

If〜ElseIf〜ElseとIfの文を書く場合、上から順番に条件合致を確認していきますので、
その場合は、以下の通りになります。
※If文を分かりやすくするため、繰り返し処理は省いています。

〜〜〜ここから〜〜〜
Sub score()

    'B1の値が、80以上だった場合
    If Range("B1") >= 80 Then
        Range("C1") = "Great" 'C1の値をGreatにする
    
    'B1の値が、60以上だった場合
    ElseIf Range("B1") >= 60 Then
        Range("C1") = "Good" 'C1の値をGoodにする
        
    'B1の値が、40以上だった場合
    ElseIf Range("B1") >= 40 Then
        Range("C1") = "OK" 'C1の値をOKにする
        
    'それ以外の場合
    Else
        Range("C1") = "Fight!" 'C1の値をFight!にする
        
    End If

End Sub
〜〜〜ここまで〜〜〜

この場合、正確な条件というのは、
80点以上・・・・・・・Great
60点以上79点以下・・・Good
40点以上59点以下・・・OK
39点以下・・・・・・・Fight!
となりますので、実はGoodとOKは複数条件になります。
しかしながら、上から順番に条件との比較を行っていく都合上、
”ElseIf Range("B1") >= 60 Then”に到達した時点では、「80点以上」という条件に合致しなかったということなので、
Goodの条件の一つである、「79点以下」は既に満たしていることになります。
そのため、複数条件の設定は不要です。

但し、順番を間違えてしまうと、想定外の値が反映されてしまうので、一つの条件によって、
どのような値が分類されているか、注意する必要があります。

例えば、上記でいうところの、GoodとOKの条件を逆に書いてしまった場合、
〜〜〜ここから〜〜〜
Sub score()

    'B1の値が、80以上だった場合
    If Range("B1") >= 80 Then
        Range("C1") = "Great" 'C1の値をGreatにする
    
    'B1の値が、40以上だった場合
    ElseIf Range("B1") >= 40 Then
        Range("C1") = "OK" 'C1の値をOKにする

    'B1の値が、60以上だった場合
    ElseIf Range("B1") >= 60 Then
        Range("C1") = "Good" 'C1の値をGoodにする
        
    'それ以外の場合
    Else
        Range("C1") = "Fight!" 'C1の値をFight!にする
        
    End If

End Sub
〜〜〜ここまで〜〜〜
二番目のElseIfの文章は、
最初の「80点以上」に合致しなかった数値(79点以下)が対象になります。
そのため、79点以下(一つ目の条件に一致しない)かつ、40点以上が条件となり、
本来Goodと表現したかった値も、ここに含んでしまうことになるのです。

3.複数の条件を表現する_02

ここから本題と言いますか、実際に複数の条件を書いていこうと思います。
先に結論を書きますと、
条件を両方満たす場合は「And」、いずれかを満たす場合は、「Or」を使えます。

例は先ほど同様のデータです。


何をやりたいかは、お察しの通りです。
「A列が”東京都”かつ、”80点以上”の場合、Great」としてみます。
※長くなるので、該当部分のみ記載します。

〜〜〜ここから〜〜〜
If Range("A1") = "東京都" And Range("B1") >= 80 Then
   Range("C1") = "Great"
EndIf
〜〜〜ここまで〜〜〜
このような感じですね。
セルを直接指定しているので、二行目以降には機能しないのですが、
もし、機能するとしたら、一行目のみGreatになり、それ以外は、空欄のままです。

※実際そのように動かしたい場合は、繰り返し処理が必要です。
 念のため、その文も記載しておきますね。
〜〜〜ここから〜〜〜
Sub score()

    Range("A1").Select

    Do

        If ActiveCell.Value = "東京都" And ActiveCell.Offset(0, 1).Value >= 80 Then
            ActiveCell.Offset(0, 2).Value = "Great"
            
        ElseIf ActiveCell.Value = "" Then
            Exit Do
            
        End If
        
    ActiveCell.Offset(1).Select
    
    Loop

End Sub
〜〜〜ここまで〜〜〜


今度は、「A列が”東京都”もしくは、”80点以上”の場合、Great」とします。

〜〜〜ここから〜〜〜
If Range("A1") = "東京都" Or Range("B1") >= 80 Then
   Range("C1") = "Great"
EndIf
〜〜〜ここまで〜〜〜
このような感じです。
こちらも同様に、セルを直接指定しているので、二行目以降には機能しないのですが、
もし、機能するとしたら、四行目までGreatになり、それ以外は、空欄です。
五行目のみ、東京都でもなく、80点以上でもないので、何も処理が起きないということです。

4.複数条件を表現する_03

かなり内容がボリューミーになってきましたが、最後です。
この条件式については、「()」を使うことで、優先度を変えることができます。

条件① And 条件② Or 条件③
このように、条件式を()で囲うことで、

「条件①と条件②を満たす」もしくは条件③
という式にすることが可能です。

たまに頭がこんがらがってきますが、これも覚えておくと便利です。

5.まとめ

前記事の繰り返しと、今回の複数条件を覚えてしまえば、
データ整理系の作業で出来ることが格段に増えます。
その割に、比較的簡単な文章になっているので、是非使ってみてください。
次回は、Selectによる条件分岐をご案内しようと思います。


それではまた

コメント