こんにちは、はやぶさです。
日々ExcelやPythonを使って、業務を効率化しています。
前回のExcelマクロとVBA入門シリーズでは、条件分岐を扱う「IFステートメント」に焦点を当てて解説しました。
今回はその続編として、「Select Caseステートメント」にスポットを当てます。
Select Caseステートメントも、IFステートメントと同じく条件分岐を扱いますが、特定のシナリオではより便利で読みやすいコードを書くことが可能です。
この記事では、Select Caseステートメントの基本から応用、IFステートメントとの比較や使い分けに至るまで、詳細にわたり解説します。
VBAにおけるプログラミングスキルをさらに向上させたい方々にとって、この記事が貴重な洞察と実用的な知識を提供し、作業のさらなる効率化に役立つことを願っています。
Select Caseステートメントとは?
Select Caseステートメントは、一つの対象の値を基にした条件分岐を効果的に扱うのに適しています。
このステートメントは、数値、文字列、日付などの多様なデータ型を検証対象として取り扱い、指定された複数のケース(条件)と比較して、該当するケースのコードブロックを実行します。
IFステートメントと比較するとSelect Caseは構文が簡潔なため、コードの読みやすさと書きやすさを向上させ、全体の可読性を高めます。
特に、複数の条件を処理する必要がある際には、Select CaseはIFステートメントよりも適した選択肢になります。
IFステートメントとの比較
IFステートメントは、条件分岐が少ない場合や複数の変数が絡む複雑な条件を扱う場合に最適です。
しかし、条件分岐の数が増えるにつれて、コードの可読性が低下する傾向にあります。
Select Caseステートメントは、一つの変数や式に基づいた複数の条件分岐を効率的に扱うのに適しています。
特に、多くの固定値による分岐が必要な場合、Select Caseはコードの可読性と管理の容易さを大幅に向上させます。
使用シナリオ
- IFステートメントは適している場合:
- 複数の変数や複雑な論理条件が分岐の決定に関わる。
- 条件分岐の数が少ない。
- Select Caseは適している場合:
- 分岐の基となるのが一つの変数や式の値。
- 条件分岐の数が多い。
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
' IFステートメントの例 Dim 月 As Long 月 = 1 If 月 = 1 Then MsgBox "ガーネット" ElseIf 月 = 2 Then MsgBox "アメジスト" ElseIf 月 = 3 Then MsgBox "アクアマリン" ElseIf 月 = 4 Then MsgBox "ダイヤモンド" ' --- 続く --- End If ' Select Caseステートメントの例 Dim 月 As Long 月 = 1 Select Case 月 Case 1 MsgBox "ガーネット" Case 2 MsgBox "アメジスト" Case 3 MsgBox "アクアマリン" Case 4 MsgBox "ダイヤモンド" ' --- 続く --- End Select |
IFステートメントを用いる場合、各分岐で条件を評価するために変数名を繰り返し記述する必要があり、これがコードの冗長性と可読性の低下を引き起こします。
これに対して、Select Caseステートメントでは比較対象を一度指定するだけで済むため、コードがすっきりとし、より読みやすくなります。
基本的な使い方
Select Caseステートメントでは、[対象]が指定されたいずれかのCaseと一致すると、対応するコードブロックが実行されます。
プログラムは上から順番に検証され、最初に一致した条件のコードブロックのみを実行し、それ以降のCaseは無視されます。
どのCaseにも一致しない場合、Case Elseに記述されたコードブロックが実行されますが、このCase Elseの記述は必須ではありません。
基本構文
1 2 3 4 5 6 7 8 9 10 |
Select Case [対象] Case [値1] ' [値1]に一致する場合の処理 Case [値2] ' [値2]に一致する場合の処理 Case [値3] ' [値3]に一致する場合の処理 Case Else ' どのCaseにも一致しない場合の処理 End Select |
例
以下の例では、月の値に応じて誕生石をメッセージボックスに表示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Dim 月 As Long 月 = 1 Select Case 月 Case 1 MsgBox "ガーネット" Case 2 MsgBox "アメジスト" Case 3 MsgBox "アクアマリン" Case 4 MsgBox "ダイヤモンド" ' --- 続く --- Case Else MsgBox "無効な月です" End Select |
この例では、月の値によって、対応するメッセージボックスが表示されるようになっています。
無効な値が入力された場合は、「無効な月です」というメッセージが表示される仕組みです。
複数の条件を指定する
コンマを使用したOr条件の指定
コンマを使用して複数の条件をOrとして指定できることは、IFステートメントに比べてSelect Caseを用いた方がコードを簡素化できる点です。
基本構文
1 2 3 4 5 6 |
Select Case [変数] Case [値1], [値2], [値3] ' 処理内容 Case Else ' その他の場合の処理 End Select |
例
1 2 3 4 5 6 7 8 9 10 11 |
Dim 日 As Long 日 = 5 Select Case 日 Case 1, 3, 5, 7 MsgBox "奇数日です。" Case 2, 4, 6 MsgBox "偶数日です。" Case Else MsgBox "指定外の日です。" End Select |
IFステートメントによる条件分岐の例:
1 2 3 4 5 6 7 8 9 10 |
Dim 日 As Long 日 = 5 If 日 = 1 Or 日 = 3 Or 日 = 5 Or 日 = 7 Then MsgBox "奇数日です。" ElseIf 日 = 2 Or 日 = 4 Or 日 = 6 Then MsgBox "偶数日です。" Else MsgBox "指定外の日です。" End If |
Toキーワードによる範囲条件の指定
Toキーワードを用いることで、連続するデータに対する操作を簡潔に記述できることは、IFステートメントに比べてSelect Caseを用いた方がコードを簡素化できる点です。
基本構文
1 2 3 4 5 6 |
Select Case [変数] Case [下限] To [上限] ' 条件に一致する場合の処理 Case Else ' その他の場合の処理 End Select |
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Dim 月 As Long 月 = 4 Select Case 月 Case 1 To 3 MsgBox "第1四半期" Case 4 To 6 MsgBox "第2四半期" Case 7 To 9 MsgBox "第3四半期" Case 10 To 12 MsgBox "第4四半期" Case Else MsgBox "無効な月です。" End Select |
IFステートメントによる条件分岐の例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Dim 月 As Long 月 = 4 If 月 >= 1 And 月 <= 3 Then MsgBox "第1四半期" ElseIf 月 >= 4 And 月 <= 6 Then MsgBox "第2四半期" ElseIf 月 >= 7 And 月 <= 9 Then MsgBox "第3四半期" ElseIf 月 >= 10 And 月 <= 12 Then MsgBox "第4四半期" Else MsgBox "無効な月です。" End If |
Select Case文でToを使用することにより、範囲を示す条件を扱う際に、コードの可読性を向上させ、複雑性を減少させます。
Isキーワードによる比較条件の指定
Isキーワードを使用することで直接的な比較演算が可能になることは、Select Caseステートメントの柔軟性と正確性を強調しています。
基本構文
Isキーワードにより、Select Case文内で直接、等価性(=, <>)や大小関係(<, <=, >, >=)などの様々な比較演算を行うことができます。
1 2 3 4 5 6 7 8 |
Select Case [変数] Case Is < [値] ' [変数]が[値]より小さい場合の処理 Case Is = [値] ' [変数]が[値]と等しい場合の処理 Case Is > [値] ' [変数]が[値]より大きい場合の処理 End Select |
例
1 2 3 4 5 6 7 8 9 10 11 |
Dim 温度 As Long 温度 = 30 Select Case 温度 Case Is >= 30 MsgBox "高温注意報" Case Is < 0 MsgBox "凍結警報" Case Else MsgBox "通常の気温です" End Select |
IFステートメントによる条件分岐の例:
1 2 3 4 5 6 7 8 9 10 |
Dim 温度 As Long 温度 = 30 If 温度 >= 30 Then MsgBox "高温注意報" ElseIf 温度 < 0 Then MsgBox "凍結警報" Else MsgBox "通常の気温です" End If |
これまでに紹介した「コンマ」、「To」、「Is」を使用した条件指定方法を組み合わせることで、Select Caseステートメントは複雑な条件分岐も簡潔に扱えます。
例えば、以下のコードでは、具体的な値、範囲指定、Isを使用した条件式を組み合わせて、多様なシナリオをカバーしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Dim 整数 As Long 整数 = 1000 Select Case 整数 Case 15 MsgBox "おめでとうございます!大当たりです!" Case 12 To 14, 16 To 18 MsgBox "当たりです!" Case Is > 100, Is < 0 MsgBox "残念、範囲外です。" Case Else MsgBox "参加賞をお持ち帰りください。" End Select |
順次進行の管理
Select Caseステートメントでは、条件は上から順に評価され、最初にTrueとなる条件の処理が実行されます。
この特性を理解し、条件を適切な順序で配置することがプログラムの正確な制御に不可欠です。
より具体的な条件を前に、一般的な条件を後ろに配置することで、予期しない挙動を防ぎます。
悪い例:
次の例では、整数が3の倍数、5の倍数、またはその両方である場合に異なるメッセージを表示します。
最も特定的な条件が最後に来るため、整数が15の場合、「バカな犬になる」ではなく「バカになる」と表示されてしまいます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Dim 整数 As Long 整数 = 15 Select Case True Case 整数 Mod 3 = 0 MsgBox "バカになる" Case 整数 Mod 5 = 0 MsgBox "犬になる" Case 整数 Mod 3 = 0 And 整数 Mod 5 = 0 MsgBox "バカな犬になる" Case Else MsgBox "普通" End Select |
良い例:
こちらの例では、最も具体的な条件を先に評価しています。
この順序により、整数が3と5の両方の倍数である場合に正しいメッセージが表示され、プログラムの挙動が期待通りになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Dim 整数 As Long 整数 = 15 Select Case True Case 整数 Mod 3 = 0 And 整数 Mod 5 = 0 MsgBox "バカな犬になる" Case 整数 Mod 3 = 0 MsgBox "バカになる" Case 整数 Mod 5 = 0 MsgBox "犬になる" Case Else MsgBox "普通" End Select |
このように条件の優先順位を適切に設定することで、Select Caseステートメントを用いたプログラムが意図した通りに正確に動作させることができます。
まとめ
この記事では、Select Caseステートメントの基礎から応用まで、その使用方法と具体例について詳しく解説しました。
Select Caseステートメントの適切な活用により、特定のシナリオにおいてIFステートメントよりも読みやすく便利なコードを記述することができます。
さまざまな書き方を試し、その便利さを実感してみてください。
キーポイント
- Select Caseステートメントとは?: 一つの対象の値に基づく条件分岐を扱う際に適したステートメントで、条件分岐の処理を簡潔に記述できます。
- IFステートメントが適している場合: 複数の変数や複雑な論理条件が分岐の決定に関わる、または条件分岐の数が少ない場合に適します。
- Select Caseが適している場合: 分岐の基が一つの変数や式の値であり、条件分岐の数が多い場合に適します。
- 基本的な使い方: 指定されたいずれかのCaseと[対象]が一致すると、対応するコードブロックが実行されます。
- 複数の条件を指定する: 「コンマ」、「To」、「Is」を使用した条件指定方法を組み合わせることで、複雑な条件分岐を簡潔に扱えます。
- 順次進行の管理: 条件は上から順に評価され、最初に真となる条件の処理が実行されます。この特性を利用し、条件を適切な順序で配置することが、プログラムの正確な制御に必要です。
プログラミングは学習と実践の繰り返しです。諦めずに継続することで、やがては複雑な問題も解決できるようになります。
この記事が、Excel VBAの世界への興味をさらに深め、日々の作業を効率化するためのツールとしてExcelマクロとVBAを活用する一助となることを願っています。