VBAのSelect Caseステートメントの使い方と例

VBAのSelect Caseステートメントは、複数の条件に基づいてプログラムのフローを制御するための強力なツールです。

このステートメントを使用することで、複数の値を比較する必要がある場合に、冗長なIfステートメントを回避することができます。この記事では、VBAのSelect Caseステートメントの使い方と例について説明します。

Select Caseステートメントの基本

Select Caseステートメントは、VBAでよく使われる条件分岐構文の一つです。複数の値を比較する場合に有用であり、Ifステートメントに似た構文を持ちますが、より簡潔で直感的な記述が可能です。

基本的な使い方は、比較する値を指定し、その値によって異なるコードブロックを実行するためのCaseステートメントを記述します。これにより、コードの可読性が向上し、ステートメントのネストを回避できるため、冗長なIfステートメントを回避することができます。

例えば、商品名によって価格を設定するプログラムを考えてみましょう。
この場合、商品名を比較するためにIfステートメントを使用することができますが、商品の種類が増えた場合にはコードが複雑化し、可読性が低下する可能性があります。
こうした場合には、Select Caseステートメントを使用することで、より簡潔なコードを書くことができます。

また、Select Caseステートメントは、複数の条件を一度に処理する場合に有用です。
例えば、ある変数が特定の値を取った場合に複数の処理を行う必要がある場合には、Ifステートメントをネストする必要がありますが、Select Caseステートメントを使用することで、より簡潔なコードを書くことができます。

以上のように、Select Caseステートメントは、より簡潔で直感的な記述が可能な条件分岐構文であり、複数の条件を一度に処理する場合に有用です。
VBAでコードを書く際には、このステートメントを上手く活用することで、より効率的なコーディングができるようになるでしょう。

Select Caseステートメントの構文

Select Caseステートメントは、複数の値を比較する場合に使用される制御フローの構文です。基本的な構文は以下の通りです。

最初に比較対象の式を指定し、次に比較値を指定していきます。比較値が一致した場合には、それに対応する処理が実行されます。Case Elseは、どの比較値にも一致しない場合に実行されるデフォルト処理を指定します。

例えば、数値の大小によって異なる処理を行う場合は、以下のようなコードになります。

また、比較値には文字列や変数、論理式なども指定できます。Case文の複数の比較値にはカンマで区切って複数指定できます。

Select Caseステートメントは、複数の条件を一度に処理する場合に有効で、コードの可読性が向上し、ステートメントのネストを回避できるため、冗長なIfステートメントを回避することができます。ただし、Case文の比較値が重複している場合や、比較値がオブジェクトの場合には注意が必要です。

サンプルコード

数値を比較する

1から12までの数値を月の数字として扱い、それに対応する月の名前を表示するプログラムを考えてみましょう。

このプログラムでは、変数monthに数値4を代入し、Select Caseステートメントでmonthの値を比較しています。

Caseステートメントで、1から12までのそれぞれの数値に対応する月の名前を表示するメッセージボックスを設定しています。

Case Elseは、monthが1から12までの数値でない場合に表示されるメッセージボックスを設定しています。

長くなりわかりにくいですね。

文字列を比較する

次の例では、文字列を比較する方法を示します。
例えば、ファイルの拡張子や、入力されたテキストを判別する場合などに利用できます。

上記の例では、変数extensionに”xlsx”を設定し、Select Caseステートメントで比較を行っています。”xlsx”という文字列がCaseステートメントの一つに含まれているので、該当のメッセージが表示されます。

複数の条件を使用する

以下は、複数の条件を使用するSelect Caseステートメントの例です。この例では、整数の値に対して、複数の条件に基づいて異なるメッセージを表示します。

この例では、変数scoreに対して、Select Caseステートメントを使用して、5つの範囲に対する異なるメッセージを表示します。
例えば、スコアが75の場合、”普通です。もう少し頑張りましょう。”というメッセージが表示されます。

Select Caseステートメントのネスト

Select Caseステートメントは、多くの条件を比較するときに役立ちますが、条件の数が多い場合は、ネストしたSelect Caseステートメントを使用することができます。
ネストしたSelect Caseステートメントは、Select Caseステートメントの中に別のSelect Caseステートメントを入れることができます。

以下は、ネストしたSelect Caseステートメントの例です。
この例では、最初に数字を比較して、数字が1または2の場合は、文字列を比較して、”A”または”B”である場合にメッセージを表示します。
数字が3または4の場合は、文字列を比較して、”C”または”D”である場合にメッセージを表示します。
それ以外の場合は、デフォルトのメッセージを表示します。

上記の例では、Select Caseステートメントの中に別のSelect Caseステートメントを入れることができることがわかります。このように、ネストしたSelect Caseステートメントを使用することで、複雑な条件分岐を行うことができます。

日付の妥当性をチェックするサンプルコード

より、実務的なコードを確認しておきましょう。

まず、isValid変数を宣言し、初期値をFalseに設定します。isValid変数は、最終的に月と年が正しい日付の形式であるかどうかを表す真偽値です。

次に、月が1以上12以下の整数かどうかを判定します。もしも月が1以上12以下の整数でなければ、isValid変数をFalseに設定し、この関数は終了します。このとき、コメントで「月が不正な値」と記されます。

次に、月の値に応じて、日付が正しいかどうかを判定します。このために、Select Case文を使います。まず、Case 4, 6, 9, 11の場合、この月は30日までしか存在しないため、日が31日以上であれば、isValid変数をFalseに設定します。そうでなければ、isValid変数をTrueに設定します。

次に、Case 2の場合、2月はうるう年の有無によって、28日または29日までしか存在しないため、日がこれらの値より大きければ、isValid変数をFalseに設定します。そうでなければ、isValid変数をTrueに設定します。

最後に、Case Elseの場合、この月は31日まで存在するため、日が32日以上であれば、isValid変数をFalseに設定します。そうでなければ、isValid変数をTrueに設定します。

全ての判定が終了した後、isValid変数の値を、この関数の戻り値として返します。戻り値がTrueであれば、月と年が正しい日付の形式であるということになります。そうでなければ、月と年が不正な日付の形式であるということになります。

ファイルの拡張子によって分岐するサンプルコード

このコードは以下の処理を行います。

  1. ファイルパスを指定するための変数 filePath を宣言し、適切なファイルパスを代入する。
  2. ファイルの拡張子を取得するための変数 extension を宣言する。
  3. Right() 関数を使用して、ファイルパス文字列の最後のドット (.) 以降の文字列を extension 変数に代入する。つまり、ファイルパスの拡張子部分を取得する。
  4. InStrRev() 関数を使用して、ファイルパス文字列の最後からドット (.) の位置を特定する。この位置から、Right() 関数で拡張子を切り出すために必要な文字列の長さを計算する。
  5. Select Case 文を使用して、ファイルの拡張子に応じた処理を実行する。ファイルの拡張子が各 Case 節のいずれかに一致する場合、対応するメッセージを MsgBox 関数で表示する。
  6. ファイルの拡張子がどの Case 節にも一致しない場合、Else 節で指定されたメッセージを MsgBox 関数で表示する。

実務上は、「filePath = “C:\Users\username\Documents\sample.xlsx”」を任意のコードに変更する必要があります。

コメント