ES000005_VBAエキスパート(ExcelVBAスタンダード)合格講座/第五回:Select Caseステートメント

ES000005_VBAエキスパート(ExcelVBAスタンダード)合格講座/第五回:Select-Caseステートメント ExcelVBA Standard

このページの内容について

このページは、VBAエキスパート(ExcelVBAスタンダード)試験合格講座の第五回記事です。公式テキスト第3章「ステートメント」の内容について解説します。自分でも手を動かしながら読み進めてください。主に講座受講者の復習での利用を想定しています。

Select Caseステートメント

基本の文法

ベーシックで学習したように分岐処理にはIfステートメントを使用しますが、Ifステートメントは「True」か「False」かの2分岐処理しかできないため、3以上の分岐を処理するには複数のIfステートメントを重ねて記述する必要があります。Select Caseステートメントは3以上の分岐処理を簡潔に記述することができます。

一致するかどうかによる分岐

比較対象と一致するかを判定する場合、Caseのあとに判定条件を記載します。判定条件は「,」で列記することができます。

サンプルコード(クリックでコピー)
Private Sub Test_SelectFruit()

Dim input_fruit As String: input_fruit = Application.InputBox("果物の名前を入力する(カタカナ)", "果物受付")

Select Case input_fruit
Case "ミカン", "オレンジ", "グレープフルーツ", "ユズ", "レモン", "シークワーサー"
Call MsgBox(input_fruit & "はバラ科です", vbInformation)
Case "リンゴ", "ナシ", "サクランボ", "モモ", "スモモ", "アンズ", "イチゴ", "ビワ"
Call MsgBox(input_fruit & "はミカン科です。", vbInformation)
Case "スイカ", "メロン"
Call MsgBox(input_fruit & "はウリ科です。", vbInformation)
Case "ブドウ", "マスカット"
Call MsgBox(input_fruit & "はブドウ科です。", vbInformation)
Case "ドリアン"
Call MsgBox(input_fruit & "はアオイ科です。", vbInformation)
Case Else
Call MsgBox(input_fruit & "は分類されていません。", vbCritical)
End Select

End Sub

Private Sub Test_IfFruit()

Dim input_fruit As String: input_fruit = Application.InputBox("果物の名前を入力する(カタカナ)", "果物受付")

If input_fruit = "ミカン" Or input_fruit = "オレンジ" Or input_fruit = "グレープフルーツ" Or input_fruit = "ユズ" Or input_fruit = "レモン" Or input_fruit = "シークワーサー" Then
Call MsgBox(input_fruit & "はバラ科です", vbInformation)
ElseIf input_fruit = "リンゴ" Or input_fruit = "ナシ" Or input_fruit = "サクランボ" Or input_fruit = "モモ" Or input_fruit = "スモモ" Or input_fruit = "アンズ" Or input_fruit = "イチゴ" Or input_fruit = "ビワ" Then
Call MsgBox(input_fruit & "はミカン科です。", vbInformation)
ElseIf input_fruit = "スイカ" Or input_fruit = "メロン" Then
Call MsgBox(input_fruit & "はウリ科です。", vbInformation)
ElseIf input_fruit = "ブドウ" Or input_fruit = "マスカット" Then
Call MsgBox(input_fruit & "はブドウ科です。", vbInformation)
ElseIf input_fruit = "ドリアン" Then
Call MsgBox(input_fruit & "はアオイ科です。", vbInformation)
Else
Call MsgBox(input_fruit & "は分類されていません。", vbCritical)
End If

End Sub
実行結果

上記サンプルコードの2つのプロシージャはどちらも同じ処理です。ユーザーから果物の入力を受け付け、その果物が何科に属するかをメッセージで表示します。

Select Caseステートメントで記述された分岐処理はすべてIfステートメントで置き換えることができます。しかし上記のように条件をORで並べる場合など、多くの場合、Select Caseステートメントで記載する方が簡潔に記述することができます。

一致以外の比較演算子による分岐

「=(イコール)」以外の比較演算子を使って分岐の判定をする場合、比較演算子の前に「Is」と記述します。

サンプルコード(クリックでコピー)
Private Sub Test_MultiIf()

Dim lot As Double: lot = Rnd

If lot > 0.9 Then
Call MsgBox("大当たり")
ElseIf lot > 0.6 Then
Call MsgBox("当たり")
Else
Call MsgBox("ハズレ")
End If

End Sub

Private Sub Test_SelectCase()

Dim lot As Double: lot = Rnd

Select Case lot
Case Is > 0.9
Call MsgBox("大当たり")
Case Is > 0.6
Call MsgBox("当たり")
Case Else
Call MsgBox("ハズレ")
End Select

End Sub
実行結果

上記サンプルコードの2つのプロシージャはどちらも同じ処理です。変数「lot」にランダムな0以上1未満の数値を代入し、代入された値に応じてメッセージを出力します。

数値や日付の範囲による分岐

「10~100の間」のように範囲を判定条件とすることもできます。

サンプルコード(クリックでコピー)
Private Sub Test_SelectRangeNumeric()

Dim input_val As Double: input_val = Application.InputBox("好きな数字を入力する", "数値受付", Type:=1)

Select Case input_val
Case Is < 0
Call MsgBox(input_val & "は0未満です", vbInformation)
Case 0
Call MsgBox(input_val & "は0です", vbInformation)
Case 1 To 50
Call MsgBox(input_val & "は1以上50以下です", vbInformation)
Case 51 To 100
Call MsgBox(input_val & "は51以上100以下です", vbInformation)
Case Is > 100
Call MsgBox(input_val & "は100より大きいです", vbInformation)
Case Else
Call MsgBox(input_val & "数値ではないようです", vbCritical)
End Select

End Sub
実行結果

上記サンプルコードはユーザーが入力した数値に応じて、数値がどの範囲に属するかをメッセージで表示します。入力をキャンセルした場合は「0」が入力されたものとみなされます。

応用編

Select Caseステートメントは3つ以上の分岐を処理することができますが、3つ未満の分岐にも使用することができます。「If」と「Select Case」のどちらを使うのかは、書きやすさや読みやすさを考慮して判断しましょう。ここからはIfステートメントをSelect Caseステートメントで簡潔に置き換えるときに使えるテクニックを紹介します。

「:」を使用してより簡潔に記述する

2行にわたって記述するコードを「:」で並べて1行にまとめることができます。Select Caseステートメントで条件一致時に実行されるコードが1行である場合、条件と実行されるコードを並べて記述することでSelect Caseステートメントがさらにすっきりした見た目になります。

サンプルコード(クリックでコピー)
Private Sub Test_SelectCaseColon()

Dim lot As Double: lot = Rnd

Select Case lot
Case Is > 0.9: Call MsgBox("大当たり")
Case Is > 0.6: Call MsgBox("当たり")
Case Else: Call MsgBox("ハズレ")
End Select

End Sub
実行結果

上記サンプルコードは前述のおみくじコードと同じ動作です。

「:」でコードを並べて記述するとき「:」の右辺には好きなだけスペースを入れることができます。そのためサンプルコードでは、実行するコードの先頭を揃えて読みやすくしています。

複雑な条件を記述する

Select Caseステートメントでは「一致」「比較演算子」「範囲」を使用して条件分岐を記述する方法が用意されていますが、上記を複合した条件を記述する方法は用意されていません。そのため、より複雑な条件を表現するには工夫が必要です。

サンプルコード(クリックでコピー)
Private Sub Test_SelectCaseTrue()

Dim input_val As Double: input_val = Application.InputBox("好きな数字を入力する", "数値受付", Type:=1)

Select Case True
Case input_val Mod 3 = 0 Or InStr(input_val, "3")
Call MsgBox(input_val & "は3の倍数もしくは、3が含まれる数値です", vbCritical)
Case Else
Call MsgBox(input_val & "は普通の数値です", vbInformation)
End Select

End Sub
実行結果

上記サンプルコードは入力された数値が3の倍数もしくは3が含まれる数値か判定し、メッセージを表示します。

Select Caseステートメントの比較対象を「True」とすることで、判定条件の結果が「True」だった場合に「一致」とみなされてコードが実行されます。

【PR】VBAエキスパート試験対策記事

当サイトでは、オデッセイコミュニケーションズ社が運営する試験であるVBAエキスパートExcel VBA ベーシックExcel VBA スタンダード)の出題範囲をベースに用語や各種関数の解説などを行っています。試験合格に向けて必須と言われる公式テキストに沿って解説をしています。受験をするか悩んでいる方、テキストとは別視点の解説を見てみたい方、受験はしないがExcelVBA(マクロ)に興味がある方へ向けた記事です。

Comment