こんにちは、Ryoです。
VBAで欠かせない処理として条件分岐がありますが、そこにIf~Thenを使うことが多いと思います。そのIfも単一条件や複数条件、比較や論理演算子を使って様々な条件指定を行うものですので、今回はIfステートメントを使ってセル塗りつぶし処理を行いながら目的に応じた処理を書いてみたいと思います。
1.サンプル概要
冒頭にも書きました通り、セルの塗りつぶし処理を行う上でIfを活用する例についてSample1からSample5まで解説していきます。
セルの塗りつぶしにはColorIndexプロパティを用いて行います。
このプロパティの詳細な解説は割愛しますが、ColorIndex番号を指定してセルに色を塗りますのでサンプルコード内で指定しているIndex番号は以下画像を参照してください。
これはMicroSoft Developer Network(MSDN)のColorIndexプロパティを参照しています。
では、各サンプルとコードを書いていきます。
2.Sample1・・・単独条件に応じた処理
以下画像のように簡易的な表があり、このなかの品番B001が書かれたセルのみ「赤色」に塗りつぶしたいとします。
目的としてはB001品番に対する処理の単独条件なので、コードとしては以下になります。
Sub Sample1() '条件判定1:「正」(True)のみ '色指定はColorIndexプロパティ,又はRGB関数で指定 Dim i As Integer For i = 5 To 7 '品番がB001であれば赤色にする処理のみ If Cells(i, 2) = "B001" Then Cells(i, 2).Interior.ColorIndex = 3 Next i End Sub
If文で「正」(True)判定を単独で行う場合は、1行で記述出来ます。
これはどういうことかと言いますと、一般的な以下の書き方をしなくても簡潔に記述できるということを表現したかったのです。
If Cells(i, 2) = "B001" Then Cells(i, 2).Interior.ColorIndex = 3 End If
特に複数条件が必要なく、単一条件で済むような処理であれば簡潔に済ませることが出来るという例です。
このサンプルコードを実行すると、以下のようになります。
2.Sample2・・・一般的な使用(複数条件)
使うサンプルはSample1と同様になりますが、品番B001は「赤」でそれ以外は「水色」にする処理を行います。
この場合、合致条件であるB001と他の品番で処理が変わりますので以下のようになります。
Sub Sample2() '条件判定2:「正」、及び「否」で分岐 Dim i As Integer For i = 17 To 19 '品番B001なら赤色 If Cells(i, 2) = "B001" Then Cells(i, 2).Interior.ColorIndex = 3 '条件が合致しなければ水色 Else Cells(i, 2).Interior.ColorIndex = 33 End If Next i End Sub
このコードの実行結果はこうなります。
先ず指定条件が「正」(True)であれば「赤」に塗り、「否」(False)であれば「水色」に塗る指定をしています。
これが一般的に最も多く使われる方法かと思います。
If 条件 Then
「正」での処理
Else
「否」での処理
End If
また、If~End Ifの間に更にIfで条件を追加することも可能で、これをネストと言います。
If 条件A Then
If 条件B Then
If 条件C Then
End If(条件CのEnd処理)
End If(条件BのEnd処理)
End If(条件AのEnd処理)
このような形でほぼ際限なくネストしていくことは可能ですが、可読性が猛烈に悪化しますので程ほどにしておくことをお勧めします。
私も始めた頃はIfを多用していたのでネストしまくった結果、後でメンテナンスする時に苦労していますからお気をつけくださいね。
3.Sample3・・・複数条件(ElseIf活用)
このサンプルも同様の表を使用します。
処理としては品番B001を「赤」、A001を「水色」、C001を「黄色」としますが、これらの品番以外が入力されていたらメッセージボックス表示するものです。
セルに色を塗る条件としては3つ有り、他に指定品番以外の処理を入れるので計4つです。
Sub Sample3() '条件判定3:「正」、及び「否」に条件判定を追加する Dim i As Integer For i = 27 To 29 '品番がB001なら赤色 If Cells(i, 2) = "B001" Then Cells(i, 2).Interior.ColorIndex = 3 '品番がA001なら水色 ElseIf Cells(i, 2) = "A001" Then Cells(i, 2).Interior.ColorIndex = 33 '品番がC001なら黄色 ElseIf Cells(i, 2) = "C001" Then Cells(i, 2).Interior.ColorIndex = 6 'どの条件にも合致しなければ警告表示 Else MsgBox "条件指定されていない入力があります!", vbCritical End If Next i End Sub
このコードの実行結果は以下になります。
最初に判定する条件Aが「否」(False)である場合に、ElseIfで再度条件指定を行うことが出来ます。ここで使うElseIfはサンプルに書いている通り、EndIfで囲う必要はありません。
また、「Else」の部分はIFやElseIfで指定した条件全てに合致しない場合の処理になります。
例えばSampleのC001をD001に変えて見ると、対象セルの処理時に全指定条件が成立しないのでメッセージボックスが表示されます。
ElseIfを使わずにIf~Then~Elseでネストさせると、なかなか面倒な記述になりますし可読性も悪くなるので、ElseIfで事足りる条件であれば活用した方がスッキリと処理できます。
4.Sample4・・・比較演算子
ここからはサンプル用の表は変わり、点数が一覧になっているものを使います。
Sample3で使用したIfとElseIfを使い、100点は「水色」、60点以下は「赤」、それ以外は「緑」で塗りつぶすサンプルコードになります。
≪比較演算子≫
= | 等しい |
<> | 等しくない |
< | より小さい |
> | より大きい |
<= | 以下 |
>= | 以上 |
これらの比較演算子を使ってIfでの条件指定を行います。
Sub Saple4() '条件判定4:比較演算子 Dim i As Integer For i = 37 To 42 '100点は水色 If Cells(i, 2) = 100 Then Cells(i, 2).Interior.ColorIndex = 33 '65点以下は赤色 ElseIf Cells(i, 2) <= 65 Then Cells(i, 2).Interior.ColorIndex = 3 'ここまでの条件に合致しない場合 '(65点を超え100点未満)は緑色 Else Cells(i, 2).Interior.ColorIndex = 4 End If Next i End Sub
このコードの実行結果は以下になります。
この比較演算子は論理演算子(And、Or、Not)と組み合わせれば、本サンプルより現実的な条件指定を行うことが出来ます。
5.Sample5・・・論理演算子
サンプルとして使用する表はSample4に少し追加したものです。
Sample4の比較演算子と論理演算子を組み合わせたサンプルコードとしています。
80点以上100点以下は「水色」、35点を超え65点未満は「黄色」、35点未満を「赤」、どの条件にも合致しなければ「緑」とし、通常の点数以外の数値(負の数や100を超える場合)は異常値として警告表示するものです。
≪よく使う論理演算子≫
And | 論理積 | If A>=1 And A<5 Then | Aが1以上、且つ5以下 |
Or | 論理和 | If A=0 Or A>5 Then | Aが0、又は5以上 |
Not | 論理否定 | If Not(A<5) Then | Aが5以下でなければ |
「よく使う」と書きましたが、表内のNotはあまり使わないです(笑)
論理演算子には他にも「Xor」排他的論理和、「Eqv」論理等価演算、「Imp」論理包含演算がありますが、ここでは触れず、使用頻度が高いと思われるAndとOrを中心に書いていますので、ご了承ください。
Sub Sample5() '条件判定5:比較&論理演算子 Dim i As Integer For i = 48 To 56 '80点以上、且つ100点以下であれば水色 If Cells(i, 2) >= 80 And Cells(i, 2) <= 100 Then Cells(i, 2).Interior.ColorIndex = 33 '0未満や100を超える数値であれば警告表示&実行終了 ElseIf Cells(i, 2) > 100 Or Cells(i, 2) < 0 Then MsgBox "入力に不正な値があります!", vbCritical Exit Sub '0では無く、35点を超え65点未満であれば黄色 ElseIf Not (Cells(i, 2) = 0) And Cells(i, 2) > 35 And Cells(i, 2) < 65 Then Cells(i, 2).Interior.ColorIndex = 6 '35点以下は赤色 ElseIf Cells(i, 2) <= 35 Then Cells(i, 2).Interior.ColorIndex = 3 'どの条件にも合致しない場合(65点以上、80点以下)は緑色 Else Cells(i, 2).Interior.ColorIndex = 4 End If Next i End Sub
先ず80以上且つ100点以下は水色にするので、Cells(i, 2) >= 80 And Cells(i, 2) <= 100とします。
次は本来の点数範囲外の数値が含まれていた場合に警告を表示する為、100より大きいか0より小さい場合の処理としてCells(i, 2) > 100 Or Cells(i, 2) < 0としてOrを使っています。
そして次の処理では、0点ではなく、35点より大きく65点より小さい場合は黄色としたいので、ElseIf Not (Cells(i, 2) = 0) And Cells(i, 2) > 35 And Cells(i, 2) < 65としています。
無理やりIf Notを使っていますが、ここは通常であればElse If Cells(I,2)>35 And Cells(I,2)<65 ThenでOKなので、実運用上ではあまりNot演算子は使わないですね…
また、1行内の記述に何度もCells(i,2)が出てきますが、これは条件式を記述する場合に都度指定する必要がある為でElse If Cells(I,2)>35 And <65 Thenの様な書き方は出来ませんから、ご注意ください。
後は35点より小さいものを赤色、ここまでの条件に合致しないものは緑とする処理をサンプルコードのように書いて実行すると、以下になります。
◆参考
本題とは反れますが、ColorIndexで塗りつぶした色を消したい場合について書いておきます。
その場合は、.Interior.ColorIndex = xlNoneとすれば指定先の色を消してくれます。
例えば、Sample5の塗りつぶしたセルを全て消す場合、
Sub Sample5_ColorClear() 'Sample5の実行結果(色)をクリアする Range(Cells(48, 2), Cells(56, 2)).Interior.ColorIndex = xlNone End Sub
これでOKです。
6.まとめ
VBAで何か処理を行う場合は必ず使うものの一つとしてIf文があると思いますので、実運用する際に使えそうな条件分岐例を挙げて書いてみました。
If文自体は演算子の使い方を誤らなければ特に問題なく使えますしが、その使いやすさから過剰にネストしてしまうと可読性とメンテナンス性の悪化を招きますので、その点はご注意くださいませ。
以上、If文の活用例(単独/複数条件/比較/論理演算子)についてでした!
今回の記事が何かの参考になれば幸いです。
Ryo