エクセルVBAのSelectCase文をつかったマクロで条件分岐する方法

VBAのSelect Case文は、複数の条件に応じた分岐する処理を簡単に書くためにつかうものです。

If文と同じく、条件に応じて実行する処理を分けることできますが、Select Case文は、条件式に対して複数の値を指定し、それぞれの値に応じて分岐する処理が指定できます。もちろん、If文でも3つ以上の分岐をするマクロを書くことは可能ですが、Select Case文の特徴として、多くの分岐をするマクロを実現する場合、If文よりも読みやすいコードでつくることができます。

If文については、本ブログの別の記事で紹介していますので、そちらをご覧ください。本記事では、複数の条件分岐を制御する上で便利に使えるSelect Case文を紹介していきます。

エクセルVBAでIf文をつかって分岐するマクロの書きかたは以下の記事で紹介しています。
独学だと中々スキルが身についた実感が湧かない。学習環境を見直してみませんか?

エクセルで繰り返しや転記作業で苦しい思いをした経験はありませんか?
今まで苦労してきたその作業を簡単なプログラムをおぼえるだけで解決できる可能性があります。
なるべくお金や時間をかけずにエクセルマクロVBAを習得したい人にはこちらの「1日速習講座」がおすすめです。

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はどの選択肢にも当てはまらないときの処理を書くといいよ。

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文で、ToIsなどのキーワードで条件を指定する方法もあります。
Toキーワードの場合は単体で指定の範囲、Isキーワードと比較演算子との組み合わせで範囲指定ができます。

以下に、ToIsキーワードをつかってCaseの条件を書いたサンプルコードを紹介します。

Case文にToIsキーワードをつかったサンプルコード(数値範囲指定)

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文にToIsキーワードをつかったサンプルコード(文字列範囲指定)

こちらは、文字列の範囲を指定したコードとなります。
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文よりも可読性が良くなる可能性があるものです。
どちらをつかっても、同じ機能や処理を実装できるのであれば、可読性といった観点で優位性のあるものを選んでつかえるテクニックとして覚えておきたいものです。

今回はここまでとなります。
さいごまでお読みいただきありがとうございます。

コダマのもりブログはにほんブログ村に登録しています。
ブログの記事が役に立ったと感じて頂けたら、フォローお願いいたします。

コメント

タイトルとURLをコピーしました