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 ステートメント