【ExcelVBA】Select Caseステートメント②
IfステートメントとSelect Caseステートメントの使いわけ
前回は、Select Caseの構文について紹介しました。
IfステートメントやSelect Caseステートメントといった条件分岐を使用することで、セルの値によって処理を変えるといったようなことができるようになります。
どちらのステートメントを使用しても条件により処理を変更するといったことができますが、状況により使いわけることでコードの見やすさがアップすることがあります。
例えば以下のような処理を考えてみましょう。
入力された月の日数を出力するとします。例えば5月であれば31日、6月であれば30日といった具合です。
この処理をSelect CaseとIfステートメントで記述してみましょう。
まずはSelect Caseステートメントです。
Sub VBA基礎第33回_1() Dim month As Integer Dim num As Integer month = 2 '月末の日付を出したい月です Select Case month Case 1, 3, 5, 7, 8, 10, 12 MsgBox "31日までです。" Case 4, 6, 9, 11 MsgBox "30日までです。" Case 2 MsgBox "28日か29日までです。" End Select End Sub
つぎにIfステートメントです。
Sub VBA基礎第33回_2() Dim month As Integer Dim num As Integer month = 10 '月末の日付を出したい月です If month = 1 Or month = 3 Or month = 5 Or month = 7 Or month = 8 Or month = 10 Or month = 12 Then MsgBox "31日までです。" ElseIf month = 4 Or month = 6 Or month = 9 Or month = 11 Then MsgBox "30日までです。" ElseIf month = 2 then MsgBox "28日か29日までです。" End If End Sub
どちらもコード自体の行数はあまり変わりありませんが、条件の部分を見て下さい。
月末が31日になるのは1月または3月か5月か7月か8月か10月か12月ですがそれをコードにする際にSelect Caseステートメントの方はCase 1, 3, 5, 7, 8, 10, 12 といった書き方ができます。
またはを表すor条件をカンマで区切って書くことができるため、見た目にすっきりします。
しかしIfの場合、Orを使用して後ろにつなげていくことになります。結果として横に長くなってしまします。
Orでつないでいかない場合、今度は以下のように下に長くなります。
Sub VBA基礎第33回_3() Dim month As Integer Dim num As Integer month = 10 '月末の日付を出したい月です If month = 1 Then MsgBox "31日までです。" ElseIf month = 3 Then MsgBox "31日までです。" ElseIf month = 5 Then MsgBox "31日までです。" '以下 全月書いていく End If End Sub
Ifステートメントで書けないことはありませんが、何度も同じような構文を書く必要がありコード自体も見づらくなります。
どの書き方でも実行結果に変わりはありませんので、好きな書き方で問題はないのですが、こうした可読性を考えて使い分けをしていたりします。
Select Caseの注意点
先ほどのような条件であればSelect Caseの方が見やすくなるのですが、条件の指定に関してはIfステートメントよりもやや制限があります。
1つの変数ではなく、複数の変数の値により条件分岐をさせたい場合などです。
例えば物品の購入数とその合計金額で送料の割引をするようなシステムを考えてみましょう。
購入数が5以上で、合計金額が10000円以上だった場合は送料無料と表示
購入数が5以下で、合計金額が10000円以上だった場合は送料半額と表示
上記2つの条件以外の場合は、送料2割引きと表示
まずIfステートメントのコードを見てみましょう。
Sub VBA基礎第33回_4() Dim purchaseNum As Integer '購入数 Dim total As Integer '合計金額 total = 10000 purchaseNum = 4 If purchaseNum >= 5 And total >= 10000 Then MsgBox "送料無料です。" ElseIf purchaseNum < 5 And total >= 10000 Then MsgBox "送料半額です。" Else MsgBox "送料2割引きです。" End If End Sub
5以上かつ10000円以上ということなので条件をandでつないで記述しています。
次の条件式では5以下かつ10000円以上を記述し、最後にどちらでもない場合の処理を記述します。
ifステートメントは条件式をandでつないでいくことができますが、1つのSelect Caseステートメントだけでは同じ処理は書けません。
Select Caseステートメントは値により条件を変えていきますが、その値を複数指定できません。
以下のように記述しようとするとエラーとなります。
Sub VBA基礎第33回_5() Dim purchaseNum As Integer '購入数 Dim total As Integer '合計金額 total = 10000 purchaseNum = 4 Select Case total,purchaseNum 'この時点でコンパイルエラーとなります。 case End Sub
値のところは1つの変数しか指定できません。今回のような複数の変数の値によって処理を変えるといったことができません。
処理のところでさらに条件分岐のコードを書けばできなくもないですが、コードが見づらくなりIfステートメントより煩雑になります。
こうした複数の変数を条件とするような場合は、Ifステートメントの方が向いています。
値によって多くの分岐を必要とするような場合はSelect Caseの方が向いており、先ほどのような複数の変数を条件としたいような場合はIfステートメントの方が向いています。
分岐の数や見やすさなどを考慮して使いわける形になりますが、最初のうちはどちらか一方(個人的にはIfの方をよく使っています)をマスターし、慣れてくるにつれて可読性などを考慮して使いわけるといった感じでよいのではないかと思います。
まとめ
・1つの変数の値によって多数の条件分岐をさせるような場合、IfステートメントとSelect CaseステートメントではIfステートメントのほうが見やすくなります。
・Select Caseステートメントは複数の変数の値を条件とするようなコードを書くのは向いていません。
確認問題
以下の「○○○」に当てはまる文言を解答してください。
・1つの変数の値によって多数の条件分岐をさせるような場合、IfステートメントとSelect Caseステートメントでは○○〇ステートメントのほうが見やすくなります。
・○○〇ステートメントは複数の変数の値を条件とするようなコードを書くのは○○〇ステートメントより向いていません。
次回は、「do loopステートメント②」です。