【VBA】Switch関数とSelect Caseステートメント【違いや記述方法を簡単に解説】

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

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

本ブログで一押しのオンラインスクールのご紹介♪




本ブログで一押しのオンラインスクール「Udemy」
筆者も利用しているスクールで、日頃の隙間時間に好きな講座が学べるので大活躍です♪

ジャンルが豊富で学びたい講座がきっとみつかる

AI・データサイエンスなど最先端のIT技術からプレゼンなどビジネススキルに関する講座まで15.5万以上(※海外講座含む)あるため、自分が学びたい講座をみつけることができます

お手頃な価格帯

1講座あたり数千~数万円程度で実践的なスキルアップが可能です。
講座は一度購入すれば視聴期限なく受講でき、30日返金保証もついているので安心して始めることができます。

学びやすい多彩な機能

0.5~2倍の変速機能で自分のペースで受講が可能、専用アプリを使えばスマホからオフライン環境でも視聴が可能です!
また、講師に直接掲示板から質問ができるので疑問を解決し自学自習をサポートしてくれます。

購入前に視聴できますので、是非興味のある方は↓をクリックしてみてください。




AccessExcelOfficeVBAプログラミング
スポンサーリンク
nyanblog
タイトルとURLをコピーしました