本ページには広告が含まれています。

VBA Switch 関数 複雑な条件分岐をスマートに制御する

VBA Switch 関数 複雑な条件分岐をスマートに制御する

Excel VBAの「Switch 関数」について解説します。

スポンサーリンク

Switch 関数とは

Excel VBA の Switch 関数は、引数リスト(式と値のペア)を評価し、Trueと評価される最初の式に関連付けられた値を返します。複雑な条件分岐をスマートに制御できる便利な関数です。

複数の条件を比較する場合に、if文よりも効率的に記述できます。特に、複数の条件が特定の定数や変数の値に依存する場合に有効です。

Switch 関数の構文や引数の設定と実際の使い方について具体的に解説していきたいと思います。

Switch 関数(Visual Basic for Applications リファレンス)

スポンサーリンク

構文(引数と戻り値)

Excel VBAの関数を使いこなすには、関数の構文を正しく理解しておくことが重要です。

構文

Switch(expr-1, value-1[, expr-2, value-2, …[, expr-n, value-n]])

引数

指定項目説明
expr【必須】評価する式を指定します
value【必須】対応するexprが True のときに返す値を指定します

exprValue はペアで構成されます。ペアリングが正しくない場合は実行時エラーが発生します。

戻り値

すべての expr を評価し、最初にTrueを返した expr に対応する Value だけが戻り値となります。

※ 次の点に注意が必要です。

  • expr(条件式) と Value(値) は必ずセットで記述します。正しくない場合はエラーが発生します。
  • 複数の expr(条件式) が True でも、最初の True しか評価されないため設定や順序が重要です。
  • expr(条件式) と Value(値) ともにエラー(除算エラーなど)がある場合、実行時エラーが発生します。
  • Value(値) の型が混在している場合、戻り値を受ける変数の型に注意する必要があります。
  • 次の場合は、Switch関数は Null を返します。
    • True となる expr が存在しなかった場合
    • True の expr に対応する ValueNull の場合

解説(使用例)

Switch 関数の使い方について、サンプルコードを使って解説します。

Switch 関数使用サンプル

Switch 関数の使用例を紹介します。

基本的な使用例

次の例は、条件式が True になると、その直後の値が返される簡単な例です。

'■Switch関数サンプル1(基本的な使用例)
Sub Switch_Sample01()
  Dim i As Integer
  Dim rep As String 

  i = 1
  rep = Switch(i = 1, "Yes", i <> 1, "No")
  MsgBox rep  ' 1 = "Yes"

End Sub

変数 i に設定した値 1 が Switch 内の条件式 i = 1 が True なのでその直後に指定した値 Yes を返しました。

Switch_Sample01のMsgBox画像

注意する点としては「Switch内の条件式はすべてが評価される」ということです。条件式は順番に評価され、最初に True を返したものだけが採用されます。また、条件式や値にエラーがある場合そこで中断されます。

Switchで日付から曜日名を取得する例

Choose関数で使用した例をSwitch関数に変更した例です。WeekDay関数を併用して、その戻り値(1~6)に対応する曜日文字を表示させます。

'■Switch関数サンプル2(曜日名を取得する例)
Sub Switch_Sample02()
  Dim inputDate As Variant
  Dim dayNum As Integer
  Dim dayText As String
  
  ' InputBoxで日付を入力
  inputDate = InputBox("調べたい日付を入力して!", "曜日調査")
  If inputDate = "" Then Exit Sub 'キャンセル(未入力)→中止
  ' WeekDay関数で曜日の整数値を取得
  dayNum = Weekday(inputDate)
  dayText = Switch( _
    dayNum = 1, "日", _
    dayNum = 2, "月", _
    dayNum = 3, "火", _
    dayNum = 4, "水", _
    dayNum = 5, "木", _
    dayNum = 6, "金", _
    dayNum = 7, "土")
  ' MsgBoxに結果を表示する
  MsgBox inputDate & "は" & dayText & "曜日です!"

End Sub

はじめに InputBox で曜日を調べたい日付を入力します。

Switch_Sample02実行時に最初に表示されるInputBox画像

入力された日付を WeekDay 関数で曜日の整数値に変換して変数 dayNum に代入します。

Switch 関数で dayNum の値に対応する曜日文字を変数 dayText に返します。

MsgBox に表示する文字列を整形して次のように表示しました。

Switch_Sample02指定日付の曜日が表示されたMsgBox画像

Switch関数の場合は、引数リストは式と値のペアにする必要があります。

一方、Choose関数の場合は、Choose(dayIndex, "日", "月", "火", "水", "木", "金", "土")
のように各値の前に条件式がないのでスッキリしています。

インデックス(数値)で値を選択(パターン選択やリスト参照)などの場合には Choose関数を使うほうが向いてると思います。

変動する数値に応じたランク分け例

次は、比較演算子を用いて数値に応じたランク分けを行うような場合の例です。

'■Switch関数サンプル3(数値に応じたランク分け例)
Sub Switch_Sample03()
  Dim score 'As Integer
  Dim rank As String
  
Redo:
  score = InputBox("点数(1~100)を入力して!", "評価判定")
  If score = "" Then Exit Sub 'キャンセル(未入力)→中止
  If IsNumeric(score) = False Then GoTo Redo  '再入力へ
  rank = Switch( _
    score > 100 Or score < 0, "False", _
    score >= 90, "A", _
    score >= 75, "B", _
    score >= 60, "C", _
    score >= 50, "D", _
    True, "E")
  If rank = "False" Then GoTo Redo  '再入力へ
  
  ' MsgBoxに結果を表示する
  MsgBox score & "点は " & rank & "評価です!"
  
End Sub

InputBox で数値(点数)を入力します。

Switch_Sample03の最初に表示されるInputBoxの画像

score の値に応じてA~Eのランクを返します。Switch関数を使わない場合は、複雑な If…ElseIf…や Select Caseなどを使います。

Switch_Sample03結果が表示されたMsgBox画像
基本的な動作と注意点
  • Switch関数の基本的な動作は、左側の式が True になるまで順に評価し、その式の直後の値を返します。
  • 複数の条件が True になる場合、最初の True 条件しか評価されないため順序設定が重要です。
  • デバッグ時に Debug.Print などで戻り値を確認し、条件や順序設定に誤りがないか確認が必要です。
  • 最後に True + 値 を置くことで、すべての条件に一致しない場合のフォールバック(デフォルト)処理を設定しておくことが可能です。
  • 条件が明確かつ順序を意識して設計することで、コードの可読性と保守性も向上します。

おわりに

VBA の Switch 関数は、複数の「条件式」から True となる最初の式に関連付けられた値を返す条件分岐関数です。

Switch 関数の使いどころとしては次のような場合です。

  • 簡潔に条件を列挙したいとき
    • if…ElseIf や Select Case などより簡潔でスマート
  • 条件が演算式やブール値などを含む場合
    • Choose 関数では対応できない
  • 条件と返す値が明快なマッピングのとき
    • 曜日、カテゴリなどのように対応する文字列や数値を返すとき
    • Choose 関数のほうが向いている場合がある

条件分岐選定のポイントを次表にまとめました。

条件のタイプ適した構文
条件が多く、単純な比較
条件がブール演算の場合など
各条件式をすべて評価する
Switch 関数
定数による値の選択
条件と値をすべて評価する
Choose 関数
複雑で長い条件
Trueの条件式以降は評価しない
入れ子構造が可能
Select Case ステートメント
条件に複雑なロジックが必要な場合
Trueの条件式以降は評価しない
入れ子構造が可能
If…ElseIf ステートメント

以上、この解説が少しでもみなさまのお役に立てたなら幸いです(^^;

VBAの関数一覧はこちらからご参照ください。

スポンサーリンク
スポンサーリンク

VBAサンプルファイルダウンロードページのご案内

このページで使用したサンプルファイルの登録はありません(^^;
ページ内のコードをコピーしてご利用ください。

ダウンロードページへのリンクは下のカードクリックでジャンプできます。
よろしければご利用ください!