スポンサーリンク

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

【高コスパ!】Windows11対応ノートパソコンを目的別にご紹介♪

みみねこ
みみねこ
値段が安くても、安かろう悪かろうでは意味がない!
ローコスト&快適に使えるスペックで、本当にお値段以上のノートパソコンを紹介します♪

ネット検索や動画視聴などのライトユーザーから、学業やビジネスで持ち運び目的のユーザーに最適!

IdeaPad Slim 550 14型 (AMD)

14.0型/最新世代Ryzen 5/メモリ 8GB/SSD 256GB/Webカメラなので、
持ち運び用として学業やビジネスにも十分使えます!

・学業、ビジネスに最適!

IdeaPad Flex 550 15.6型 (AMD Ryzen™ 5000シリーズ)

15.6型/最新世代Ryzen 5/メモリ 8GB/SSD 256GB/Webカメラ/2 in 1タッチパッド・タッチペン付なので、学業やビジネスに!

・動画編集やネットゲームに最適!

Legion 560(15)

15.6型/最新世代Ryzen 7/メモリ 16GB/SSD 1TB/GeForce GTX1650/Webカメラなので、
3Dゲームや動画編集に!

最近は、Lenovo製品が最もコスパが良い印象なので、Lenovo製品中心に紹介しています。
コスパが高いだけではなく、故障しやすかったり、タイピングしにくかったりとチープな要素が少ない等、他社類似メーカーと比べても優れています。
ただ、実際に購入される際は、海外メーカー特有ではありますが納期が遅い商品も多く、納品日にはご注意されてくださいね。

AccessExcelOfficeVBAプログラミング
スポンサーリンク
nyanblog ~にゃんぶろぐ~
タイトルとURLをコピーしました