Access Excel Office VBA プログラミング

VBAには条件分岐の手段の一つとしてSwitch関数Select Caseステートメントがありますが、これらの違いや記述方法を紹介します。
C言語やJAVA言語でのswitch文との比較もしてますので、そちらも良かったらどうぞ♪

Switch関数

Switch関数は、ある式(expr)を評価し、Trueであれば値や式(value)を返します。

構文については以下となります。

Switch(expr_1,value_1,[expr_2,value_2…,[expr_n,value_n]))
expr :必須。評価する式を指定
value:必須。式がTrueの場合に返される値または式

記述例として、以下を用意しました。
変数の値と特定の値が一致すれば、メッセージを返し、イミディエイトウィンドウに表示します。

' PrintImmediate
' イミディエイトウィンドウにメッセージを表示
Sub PrintImmediate()
    
    Dim sMsg As String
    sMsg = GetMsg_Switch(2)
    
    Debug.Print sMsg
    
End Sub
' GetMsg_Switch(Integer)
' Switch関数を使ってメッセージを取得
Function GetMsg_Switch(iMsgCase As Integer)

    GetMsg_Switch = Switch(iMsgCase = 1, "正常1", iMsgCase = 2, "正常2")

End Function

結果は、「正常2」と表示されます。

Switch関数を使っていく上で知っておきたいポイントは以下になります。
(例については上記の記述例を元にしています。)
・Switch関数を変数に代入しないとコンパイルエラーとなる
例)○GetMsg_Switch = Switch(iMsgCase = 1, “正常1”, iMsgCase = 2, “正常2”)
  ×Switch(iMsgCase = 1, “正常1”, iMsgCase = 2, “正常2”)
・全ての式を評価するため、除算エラー等が起きる式には要注意
例)iMsgCase = 1で、
  GetMsg_Switch = Switch(iMsgCase = 1, “正常1”, iMsgCase = 2, “正常2”, iMsgCase = 3, 5 / 0)
  といったコードの場合、「iMsgCase = 3, 5 / 0」部分も評価し除算エラーとなります。
・式がFalseだった場合、Nullを返す
例)iMsgCaseが3の場合、Nullを変数に代入しようとするため、エラーが起きます。

こういったマイナス要素があるため、私は次項の「Select Caseステートメント」がおすすめです。

Select Caseステートメント

Select Caseステートメントは、ある変数の値(testexpression)を複数の値(expressionlist-n)と比較し、一致していれば特定の処理(statements-n)を行います。

構文については以下となります。

Select Case testexpression
[ Case expressionlist-n [ statements-n ]]
[ Case Else [ elsestatements ]]
End Select

testexpression:必須。 任意の変数を指定
expressionlist-n:省略可能。Caseがある場合は必須
statements-n:省略可能。値が一致していた場合実行される処理
elsestatements 省略可能。値が一致しない場合に実行される処理

記述例として、以下を用意しました。
変数の値と特定の値が一致すれば、メッセージを返し、イミディエイトウィンドウに表示します。

' PrintImmediate
' イミディエイトウィンドウにメッセージを表示
Sub PrintImmediate()
    
    Dim sMsg As String
    sMsg = GetMsg_SelectCase(2)
    
    Debug.Print sMsg
    
End Sub
' GetMsg_SelectCase(Integer)
' SelectCaseステートメントを使ってメッセージを取得
Function GetMsg_SelectCase(iMsgCase As Integer)

       
    Select Case iMsgCase
    Case 1
        GetMsg_SelectCase = "正常1"
    Case 2
        GetMsg_SelectCase = "正常2"
    Case Else
        GetMsg_SelectCase = "異常"
    End Select
        

End Function

結果は、「正常2」と表示されます。
もし、sMsg = GetMsg_SelectCase(3)だった場合は、「異常」と表示されます。

変数に想定外の値が入っていても、Case Elseがあるためエラーを出さずに対応できます。

参考(C言語のswitch文との比較)

参考になりますが、C言語のswitch文は以下のような書き方をします。

int iMsgCase = 2;

switch(iMsgCase){
  case 1:
    printf("正常1¥n");
    break;
  case iMsgCase:
    printf("正常2¥n");
    break;
  default:
    printf("異常¥n");
}

記述内容はほぼSelect Caseステートメントで、内容もほぼ同等の性能です。
逆にSwitch関数とは、名前は似てますが内容は似てません。

最後に

今回は、Switch関数やSelect Caseステートメントについて紹介しました。
両者比較すると、マイナスポイントの多いSwitch関数を使うよりは、Select Caseステートメントを使った方がよいのかなと思います。

Switch関数の強みは条件分岐を1行で書けるところかな?と当初考えましたが、いざコードを書いてみると1行に条件を詰め込むのは逆に読みにくいかもと感じました。。

以下まとめです。

・個人差あるかもしれませんが性能は、
 Select Caseステートメント>>>Switch関数
・C言語のswitch文とVBAのSwitch関数は似てるようで似てない
          VBAでほぼ同等の性能はSelect Caseステートメント

以上、今回の記事が何かの参考になれば幸いです。来訪ありがとうございました♪

本記事で参考にさせていただいたサイト:
Microsoft Doc:Switch 関数
Microsoft Doc:Select Case ステートメント