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ステートメントは、複数の値を比較する場合に使用される制御フローの構文です。基本的な構文は以下の通りです。
1 2 3 4 5 6 7 8 9 10 |
Select Case [比較対象の式] Case [比較値1] [処理1] Case [比較値2] [処理2] Case [比較値3] [処理3] Case Else [デフォルト処理] End Select |
最初に比較対象の式を指定し、次に比較値を指定していきます。比較値が一致した場合には、それに対応する処理が実行されます。Case Elseは、どの比較値にも一致しない場合に実行されるデフォルト処理を指定します。
例えば、数値の大小によって異なる処理を行う場合は、以下のようなコードになります。
1 2 3 4 5 6 7 8 9 10 |
Select Case num Case Is < 0 Debug.Print "負の数です" Case 0 Debug.Print "0です" Case 1 To 10 Debug.Print "1以上10以下の数です" Case Is > 10 Debug.Print "11以上の数です" End Select |
また、比較値には文字列や変数、論理式なども指定できます。Case文の複数の比較値にはカンマで区切って複数指定できます。
Select Caseステートメントは、複数の条件を一度に処理する場合に有効で、コードの可読性が向上し、ステートメントのネストを回避できるため、冗長なIfステートメントを回避することができます。ただし、Case文の比較値が重複している場合や、比較値がオブジェクトの場合には注意が必要です。
サンプルコード
数値を比較する
1から12までの数値を月の数字として扱い、それに対応する月の名前を表示するプログラムを考えてみましょう。
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 32 33 34 |
Sub SelectCaseExample1() Dim month As Integer month = 4 ' 月の数字を4とする Select Case month Case 1 MsgBox "1月はJanuaryです。" Case 2 MsgBox "2月はFebruaryです。" Case 3 MsgBox "3月はMarchです。" Case 4 MsgBox "4月はAprilです。" Case 5 MsgBox "5月はMayです。" Case 6 MsgBox "6月はJuneです。" Case 7 MsgBox "7月はJulyです。" Case 8 MsgBox "8月はAugustです。" Case 9 MsgBox "9月はSeptemberです。" Case 10 MsgBox "10月はOctoberです。" Case 11 MsgBox "11月はNovemberです。" Case 12 MsgBox "12月はDecemberです。" Case Else MsgBox "不正な値です。" End Select End Sub |
このプログラムでは、変数month
に数値4を代入し、Select Case
ステートメントでmonth
の値を比較しています。
Case
ステートメントで、1から12までのそれぞれの数値に対応する月の名前を表示するメッセージボックスを設定しています。
Case Else
は、month
が1から12までの数値でない場合に表示されるメッセージボックスを設定しています。
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 32 33 |
Sub IfExample1() Dim month As Integer month = 4 ' 月の数字を4とする If month = 1 Then MsgBox "1月はJanuaryです。" ElseIf month = 2 Then MsgBox "2月はFebruaryです。" ElseIf month = 3 Then MsgBox "3月はMarchです。" ElseIf month = 4 Then MsgBox "4月はAprilです。" ElseIf month = 5 Then MsgBox "5月はMayです。" ElseIf month = 6 Then MsgBox "6月はJuneです。" ElseIf month = 7 Then MsgBox "7月はJulyです。" ElseIf month = 8 Then MsgBox "8月はAugustです。" ElseIf month = 9 Then MsgBox "9月はSeptemberです。" ElseIf month = 10 Then MsgBox "10月はOctoberです。" ElseIf month = 11 Then MsgBox "11月はNovemberです。" ElseIf month = 12 Then MsgBox "12月はDecemberです。" Else MsgBox "不正な値です。" End If End Sub |
長くなりわかりにくいですね。
文字列を比較する
次の例では、文字列を比較する方法を示します。
例えば、ファイルの拡張子や、入力されたテキストを判別する場合などに利用できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Sub SelectCaseExample2() Dim extension As String extension = "xlsx" ' 拡張子をxlsxとする Select Case extension Case "xlsx" MsgBox "Excelファイルです。" Case "docx" MsgBox "Wordファイルです。" Case "pptx" MsgBox "PowerPointファイルです。" Case Else MsgBox "不明なファイルです。" End Select End Sub |
上記の例では、変数extension
に”xlsx”を設定し、Select Caseステートメントで比較を行っています。”xlsx”という文字列がCaseステートメントの一つに含まれているので、該当のメッセージが表示されます。
複数の条件を使用する
以下は、複数の条件を使用するSelect Caseステートメントの例です。この例では、整数の値に対して、複数の条件に基づいて異なるメッセージを表示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Sub SelectCaseExample3() Dim score As Integer score = 75 ' スコアを75とする Select Case score Case 0 To 59 MsgBox "赤点です。もう少し頑張りましょう。" Case 60 To 69 MsgBox "単位は取れますが、もう少し頑張りましょう。" Case 70 To 79 MsgBox "普通です。もう少し頑張りましょう。" Case 80 To 89 MsgBox "良くできました。" Case 90 To 100 MsgBox "素晴らしい!大変よくできました。" Case Else MsgBox "不正な値です。" End Select End Sub |
この例では、変数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”である場合にメッセージを表示します。
それ以外の場合は、デフォルトのメッセージを表示します。
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 |
Sub SelectCaseExample4() Dim number As Integer Dim letter As String number = 2 letter = "A" Select Case number Case 1, 2 Select Case letter Case "A", "B" MsgBox "数字は1または2で、文字列はAまたはBです。" Case Else MsgBox "数字は1または2ですが、文字列はAまたはBではありません。" End Select Case 3, 4 Select Case letter Case "C", "D" MsgBox "数字は3または4で、文字列はCまたはDです。" Case Else MsgBox "数字は3または4ですが、文字列はCまたはDではありません。" End Select Case Else MsgBox "数字は1から4の範囲外です。" End Select End Sub |
上記の例では、Select Caseステートメントの中に別のSelect Caseステートメントを入れることができることがわかります。このように、ネストした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 32 33 34 35 36 37 38 |
Function ValidateMonthAndYear(month As Integer, year As Integer) As Boolean Dim isValid As Boolean If month < 1 Or month > 12 Then isValid = False ' 月が不正な値 Else Select Case month Case 4, 6, 9, 11 ' 30日の月 If day > 30 Then isValid = False ' 日が不正な値 Else isValid = True ' 入力値が妥当 End If Case 2 ' 2月 If year Mod 4 = 0 And year Mod 100 <> 0 Or year Mod 400 = 0 Then If day > 29 Then isValid = False ' 日が不正な値 Else isValid = True ' 入力値が妥当 End If Else If day > 28 Then isValid = False ' 日が不正な値 Else isValid = True ' 入力値が妥当 End If End If Case Else ' 31日の月 If day > 31 Then isValid = False ' 日が不正な値 Else isValid = True ' 入力値が妥当 End If End Select End If ValidateMonthAndYear = isValid End Function |
まず、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 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 |
Sub CheckFileExtension() ' ファイルパスを指定 Dim filePath As String filePath = "C:\Users\username\Documents\sample.xlsx" ' 拡張子を取得 Dim extension As String extension = Right(filePath, Len(filePath) - InStrRev(filePath, ".")) ' 拡張子のチェック Select Case extension Case "xlsx" MsgBox "Excelファイルです。" Case "xls" MsgBox "Excelファイルです。" Case "xlsm" MsgBox "Excelマクロ有効ファイルです。" Case "docx" MsgBox "Wordファイルです。" Case "doc" MsgBox "Wordファイルです。" Case "pptx" MsgBox "PowerPointファイルです。" Case "ppt" MsgBox "PowerPointファイルです。" Case Else MsgBox "不明なファイルです。" End Select End Sub |
このコードは以下の処理を行います。
- ファイルパスを指定するための変数
filePath
を宣言し、適切なファイルパスを代入する。 - ファイルの拡張子を取得するための変数
extension
を宣言する。 Right()
関数を使用して、ファイルパス文字列の最後のドット (.) 以降の文字列をextension
変数に代入する。つまり、ファイルパスの拡張子部分を取得する。InStrRev()
関数を使用して、ファイルパス文字列の最後からドット (.) の位置を特定する。この位置から、Right()
関数で拡張子を切り出すために必要な文字列の長さを計算する。Select Case
文を使用して、ファイルの拡張子に応じた処理を実行する。ファイルの拡張子が各Case
節のいずれかに一致する場合、対応するメッセージをMsgBox
関数で表示する。- ファイルの拡張子がどの
Case
節にも一致しない場合、Else
節で指定されたメッセージをMsgBox
関数で表示する。
実務上は、「filePath = “C:\Users\username\Documents\sample.xlsx”」を任意のコードに変更する必要があります。
コメント