前回、繰り返し処理について、記事を書きました。
【Excel/VBA】繰り返し処理をやってみる
今回は、その中に発生した「条件分岐」について、複数条件を実施してみたいと思います。
〜〜〜ここから〜〜〜
【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!」
「100点満点のテストで、80点以上はGreat、60点以上はGood、40点以上はOK、それ以外はFight!」
という条件の元、C列を埋めていきたいとします。
If〜ElseIf〜ElseとIfの文を書く場合、上から順番に条件合致を確認していきますので、
その場合は、以下の通りになります。
※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
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による条件分岐をご案内しようと思います。
それではまた
コメント
コメントを投稿