VBAのSelect Case文は、複数の条件に応じた分岐する処理を簡単に書くためにつかうものです。
If文と同じく、条件に応じて実行する処理を分けることできますが、Select Case文は、条件式に対して複数の値を指定し、それぞれの値に応じて分岐する処理が指定できます。もちろん、If文でも3つ以上の分岐をするマクロを書くことは可能ですが、Select Case文の特徴として、多くの分岐をするマクロを実現する場合、If文よりも読みやすいコードでつくることができます。
SelectCase文はIf文と同じく、条件分岐で使えるものだよ。
If文については、本ブログの別の記事で紹介していますので、そちらをご覧ください。本記事では、複数の条件分岐を制御する上で便利に使えるSelect Case文を紹介していきます。
Excelvba|Select Case文の構文
SelectCase文の構文
Select Case 変数または式
Case 値1
'値1に対する処理
Case 値2
'値2に対する処理
Case 値3
'値3に対する処理
Case Else
'どのCaseにも一致しない場合の処理
End Select
Select Case から End Select までの間に、選択肢の条件と処理を書いていくよ。
この構文について説明します。
Select Caseと変数または式の指定
Select Caseキーワードを使用して、分岐処理の開始を宣言します。
次に、分岐の基準となる変数または式を指定します。
Select Case 変数または式
Case文の指定
次にCase文を使用して、変数または式が取りうる値に応じた分岐処理を記述します。
Case文には、値を1つ指定する場合と、複数の値を指定する場合があります。
値を1つ指定する場合は、以下のように記述します。
Case 値
複数の値を指定する場合は、カンマで区切って複数の値を指定します。
Case 値1, 値2, 値3
Case Elseの指定
Case Elseは、どのCase文にも一致しなかった場合に実行される処理を記述するために使用します。
Case Elseは省略可能で、必要に応じて使用します。
Case Else
Case Elseはどの選択肢にも当てはまらないときの処理を書くといいよ。
なぜ、膨大な事務作業でも定時で退社できるのか。
実務をプロから学べる「ユースフル」の動画は永年見放題。Q&A機能で分からないを放置しないから安心。
詳しくは以下のリンクをクリック
End Select
End Select
分岐処理の終了を宣言します。If文で言えばEnd Ifの部分となります。
SelectCase文をつかったサンプルコード
それでは、SelectCaseをつかってサンプルコードをいくつか書いてみましょう。
SelectCase文で数値による複数の条件分岐
ここでは、サンプルコードとして、変数nが1, 2, 3のいずれかで処理を分岐する場合、以下のようにSelect Case文が書けます。
入力コード
Sub SelectCase_sample()
Dim n As Long
n = 1
Select Case n
Case 1
Debug.Print "nが1の場合の処理"
Case 2
Debug.Print "nが2の場合の処理"
Case 3
Debug.Print "nが3の場合の処理"
End Select
End Sub
SelectCase文は、複数の値に対して同じ処理を実行する場合や、複数の条件分岐を実装する場合に可読性の高い(見やすい)コードが書けます。
実行結果
nが1の場合の処理
サンプルコードでは、変数nの値が 1 なので必ず同じ結果になるよ。
SelectCase文で文字列による複数の条件分岐
こちらは信号の色の条件として(”あお”、”きいろ”、”あか”)を変数nに代入して、その条件に応じて処理を分岐するプログラムになります。
入力コード
Sub SelectCase_sample()
Dim n As String
n = "あお"
Select Case n
Case "あか"
Debug.Print ("停止してください。")
Case "きいろ"
Debug.Print ("停止してください。ただし、安全に停止できない場合は注意して進行してください。")
Case "あお"
Debug.Print ("進行してください。")
End Select
End Sub
実行結果
進行してください。
信号の状態に応じて動作をかえる。そんなイメージならわかりやすいかな。
SelectCase文の条件で範囲指定するときのキーワード
SelectCase文で、ToやIsなどのキーワードで条件を指定する方法もあります。
Toキーワードの場合は単体で指定の範囲、Isキーワードと比較演算子との組み合わせで範囲指定ができます。
以下に、ToやIsキーワードをつかってCaseの条件を書いたサンプルコードを紹介します。
Case文にToやIsキーワードをつかったサンプルコード(数値範囲指定)
Rnd関数をつかって0から30までの数値を生成し、そのあとに生成した数値を変数nに代入します。
Select Case文をつかって、変数nの値を判定して、値に応じて分岐し処理を実行します。
ここでは、変数nに生成された数値が、以下の値であったときに処理を分岐するコードにしています。
Rnd関数で生成される数値は、30までになるようにしてるよ。
入力コード
Sub SelectCase_sample()
Dim n As Long
n = Int((30 * Rnd) + 1)
Select Case n
Case 0
Debug.Print "0です"
Case 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Debug.Print "nは1~10で、カンマ区切りでの条件判定です。"
Case 11 To 20
Debug.Print "nは11~20で、Toキーワードでの条件判定です。"
Case Is >= 21
Debug.Print "nは21~30で、Isキーワードでの条件判定です。"
End Select
End Sub
サンプルコードの解説をしていくよ。
Case 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
条件として複数の値をカンマ区切りで指定しています。
1 To 10、Is<=1, Is>=10などの書き方でも同じ条件の指定ができます。
Case 11 To 20
Toキーワードで11~20までの条件を指定しています。Is<=11, Is>=20でも同じ条件の指定ができます。
Case Is >= 21
Isキーワードで21以上を指定しています。21 To 30と書くこともできます。
本記事のサンプルコードでは、キーワードの使い方を紹介することを目的としているため、Case文の条件(式)をあえて複数の書き方で記述しています。
実行結果
●Rnd関数によって生成され、変数nに代入した値が、0だった場合の実行結果
0です
●Rnd関数によって生成され、変数nに代入した値が1~10だった場合の実行結果
nは1~10で、カンマ区切りでの条件判定です。
●Rnd関数によって生成され、変数nに代入した値が、11~20だった場合の実行結果
nは11~20で、Toキーワードでの条件判定です。
●Rnd関数によって生成され、変数nに代入した値が、21~30だった場合の実行結果
nは21~30で、Isキーワードでの条件判定です。
数値範囲指定の書き方(If文で書いたコードとの比較)
以下のコードはSelect Case文と、If文で同じ処理を書いたものです。
どちらをつかえば正解といったことはありません。Select Case文で書いた方が見やすい(可読性が上がる)のであればSelect Case文。If文で書いた方が見やすいのであればIf文で書けるようにしておくことが理想的です。
ただし、一般的には3つ以上の分岐となるようなマクロをつくるのであれば、Select Case文で書くことをおすすめします。
Select Case文で書いたコードサンプルコード
Sub SelectCase_sample()
Dim n As Long
n = Int((30 * Rnd) + 1)
Select Case n
Case 0
Debug.Print "0です"
Case 1 To 10
Debug.Print "nは1~10と判定されました。"
Case 11 To 20
Debug.Print "nは11~20と判定されました。"
Case Is >= 21
Debug.Print "nは21以上と判定されました。"
End Select
End Sub
If文で書いたサンプルコード
Sub SelectCase_sample()
Dim n As Long
n = Int((30 * Rnd) + 1)
If n = 0 Then
Debug.Print "0です"
ElseIf 1 <= n And 10 >= n Then
Debug.Print "nは1~10と判定されました。"
ElseIf 11 <= n And 20 >= n Then
Debug.Print "nは11~20と判定されました。"
ElseIf n >= 21 Then
Debug.Print "nは21以上と判定されました。"
End If
End Sub
Case文にToやIsキーワードをつかったサンプルコード(文字列範囲指定)
こちらは、文字列の範囲を指定したコードとなります。
Case “0” To “9”の行は、変数nが「半角数字」だった場合に実行。同様にCase “A” To “Z”, “a” To “z”で「半角アルファベット」で、Case “あ” To “ん”では「ひらがな」だった場合に実行されます。
Sub SelectCase_sample()
Dim n As String
n = "を"
Select Case n
Case "0" To "9"
Debug.Print "変数nは、半角の数字"
Case "A" To "Z", "a" To "z"
Debug.Print "変数nは、半角アルファベット"
Case "あ" To "ん"
Debug.Print "変数nは、全角ひらがな"
Case Else
Debug.Print "変数nは、これらに当てはまらない文字列です。"
End Select
End Sub
サンプルコードでは、変数nに“を“を代入してますので、Case “あ” To “ん”の条件に一致し、処理が実行されます。
実行結果
変数nは、全角ひらがな
“あ” to “ん”って書くと、ひらがなの範囲を指定できるのは便利だね。
Case文にLike演算子をつかったサンプルコード
VBAのLike演算子は、文字列が特定のパターンに一致するかどうかを調べるために使用されます。Like演算子は、ワイルドカード”*”を使用して、パターンを指定できます。Like演算子は、文字列のパターンマッチングに使用されるため、文字列の検索や抽出に有効に使えます。
Sub SelectCase_sample()
Dim text As String
text = "SelectCaseステートメントでプログラム"
Select Case True
Case text Like "*Ifステートメント*"
Debug.Print "Ifステートメントという文字列が含まれている"
Case text Like "*SelectCaseステートメント*"
Debug.Print "SelectCaseステートメントという文字列が含まれている"
Case Else
Debug.Print "IfステートメントもSelectCaseステートメントの文字列も含まれていない"
End Select
End Sub
Select Caseの行(テスト式)に「True」を書くところがポイントです。このサンプルコードでは、変数textに”SelectCaseステートメント”という文字列が含まれているため、実行結果は以下のようになります。
行(テスト式)に「False」を指定することもでき、その場合は一致しないケースの処理が実行されるようになります。
実行結果
SelectCaseステートメントという文字列が含まれている
複数の条件分岐[Select Case]文のまとめ
01.Select Case文の特徴
02.Select Case文の構文
03.Select Case文にカンマやキーワードを用いた汎用的な式について
プログラミングの条件分岐と言えば、If文のイメージが強く、それは、VBAにおいても例外ではありません。
そのため、条件分岐の処理を書くときは、If文を真っ先に思い浮かべるのは至極自然なことだと思います。
Select Case文であろうと、If文であろうと、マクロを作成する上で一方が正解で、もう一方が間違っているわけではありません。
プログラムは、エラーやミスのないものを作ることが理想であり、それを目指してつくることが前提です。
ただし、最初から完璧でミスのないものを作成することは極めて困難となります。さらに、長く愛用されるプログラムやアプリほど、新たな機能を追加することや、動作の改善をするためプログラムの修正が発生することは当然と言えるでしょう。
つまり、ある程度は不具合改修や、アップデートを想定したうえでコードを書くことも、開発時のポイントとなるコメントを残しておくことも、品質向上への貢献度が高い行為であり、欠かすことのできないものです。
従ってプログラムを書く上では、可読性(読みやすい)といった観点の優先度はかなり高いものだと言えます。
Select Case文は、If文と同じく条件を判定して処理を分岐するフロー制御文です。また、複数の条件分岐を実行するコードを書く上では、If文よりも可読性が良くなる可能性があるものです。
どちらをつかっても、同じ機能や処理を実装できるのであれば、可読性といった観点で優位性のあるものを選んでつかえるテクニックとして覚えておきたいものです。
今回はここまでとなります。
さいごまでお読みいただきありがとうございます。
コダマのもりブログはにほんブログ村に登録しています。
ブログの記事が役に立ったと感じて頂けたら、フォローお願いいたします。
コメント