ExcelVBA_Select文の書き方

この記事を読むのに必要な時間は約 11 分です。

 

条件分岐させる方法の1つに、SelectCase文というのがあります。

 

「これ、SelectCase文で書いたらスッキリとキレイに見えるのに・・・」
という場合もあれば、IF文じゃないと書けないものも。

 

実際どんな風に処理を書くのか、どんな時が適しているのか、紹介します。

スポンサーリンク

SelectCase文の書き方

日本語で書くと、次のようになります。

 

Select Case 変数

Case 条件式1

処理1

Case 条件式2

処理2

Case 条件式3

処理3

Case Else

その他の処理

End Select

 

値や条件式などを入れて、具体的な書き方を見てみましょう。

値が一致する場合

変数i が1のとき、2のとき、3のとき、・・・ のように、それぞれの値の場合の処理を書きます。

VBA_SelectCase文

 

SelectCase文だけど、最初から i = 3と入れているので、どの分岐に入るのかバレバレです。

Public Sub CaseTest1()

    Dim i As Integer
    
    i = 3

    Select Case i
        
        Case 1
            MsgBox "一"

        Case 2
            MsgBox "二"
            
        Case 3
            MsgBox "三"
            
        Case 4
            MsgBox "四"
        
        Case Else
            MsgBox "その他"
    
    End Select

End Sub

 

もちろん、「三」を表示する処理が行われました。

VBA_SelectCase文

 

Isで範囲指定する場合

Case 1, 2, 3,4 ・・・
のように、1つの分岐に入る条件をカンマ区切りで書いていくことも可能です。

 

でもこれを全部書いていたら、ソースを読みづらくて仕方ありません。
書く方も辛いですし。

 

そんな時は範囲で指定して書くと楽です。

 

15未満なら、Case < 15 で表現できます。
以下ならCase <= 15と書けますし、「より大きい」なら Case > 15、以上なら Case >= 15。

 

「=」を入れるか入れないか、含むか含まないかが重要だったりします。

VBA_SelectCase文

 

2つめの分岐である18未満(< 18)、その中に15未満(15 <)も含まれるんじゃ??と思ってしまうかもしれません。

 

もちろんその通りなんですが、処理は上から先に実行されます。
先に15未満の分岐を書いておけば、15以上18未満の場合は最初引っかからず、18未満(< 18)で初めて条件に当てはまるわけです。

 

なので、順番大事です。

 

2つ目のソースコードはこちら。

'Case文、範囲
Public Sub CaseTest2()

    Dim i As Integer
    
    i = InputBox("年齢を入力してください")

    Select Case i
        
        Case Is < 15
            MsgBox "購入には、保護者の同意が必要です"

        Case Is < 18
            MsgBox "18歳以上が対象の商品は・・・" & vbCrLf _
                 & "15歳以上対象の商品まで購入可能です"
            
        Case Else
            MsgBox "購入可能です"
    
    End Select

End Sub

 

InputBoxで年齢を入力できるようにしました。

 

「15」を入力してみると・・・、
15以上、18未満なので2番目の分岐に入りました。

VBA_SelectCase文

 

Toで範囲指定する場合

先ほどIsで範囲指定したところ、Toでもほとんど同じことが出来ます。

VBA_SelectCase文

 

15未満ならCase 0 To 14、18未満ならCase 15 To 17と書き換えました。

 

ソースコードはこちら。

'Case文、範囲2
Public Sub CaseTest3()

    Dim i As Integer
    
    i = InputBox("年齢を入力してください")

    Select Case i
        
        Case 0 To 14
            MsgBox "購入には、保護者の同意が必要です"

        Case 15 To 17
            MsgBox "18歳以上が対象の商品は・・・" & vbCrLf _
                 & "15歳以上対象の商品まで購入可能です"
            
        Case Else
            MsgBox "購入可能です"
    
    End Select

End Sub

 

同じように動かしてみます。

 

今回は「10」を入れてみます。
Case 0 To 14 に当てはまるので、最初の分岐の処理が行われました。

VBA_SelectCase文

 

今回はIsでの範囲指定もToの場合も同じ結果になりますが、注意したいのは境界値のところです。

 

整数(Integer)ではなく少数(Double)だったら、14より大きくて15より小さいところは漏れて、Case Elseに入ってしまいます。

 

そんな細かい指定も必要なら、Isで含むか含まないかを表現できる書き方がベストです。

条件分岐でIF文よりもSelectCase文のほうが良いときは?

SelectCase文は、同じ変数の中で分岐が多い場合に役立ちます。

 

分岐が多くても、IF文で書くことも可能です。
IF文の書き方はこちら。

 

 

じゃあ、If文とSelectCase文、どっちが正解なんだよって思いますよね。

SelectCase文のほうが良いとき

ElseIfでたくさん繋げていけば、分岐をたくさん書けるんですが、SelectCase文なら変数を書くのが1回で済みます。

 

Select Case 変数 
と書いたら、そのあとの分岐は
Case 10とか、Case >100、Case like “山田*” だけ。

 

スッキリ書くことが出来ます。

VBA_SelectCase文

 

IF文だと、変数 = 10、変数 > 100、変数 like “山田*”
のように書かないといけません。

IF文のほうが良いとき

具体的な書き方はIF文の記事を参考にしていただければと思いますが、IF文が力を発揮するのはこんな時です。

 

  • 条件が少ないとき
  • 1行でも書ける
  • 条件となる変数が2つ以上

 

男性か女性かで処理を分けるとか、
If ~ Then
Else
End If
で書けちゃいます。

 

1行で書く方法もありますし、場合によってはIF文がシンプルです。

 

また、変数が1つではない時、Else Ifで別の変数の値を評価することも可能、そんなことはSelectCase文ではスマートに出来ません。

 

Case Elseの中に、別の変数についてSelectCase文を書く羽目になります。

 

だったらそんな無理せずに、IF文使って楽したいですよね。

スポンサーリンク

まとめ:SelectCase文で条件分岐する書き方

SelectCase文の書き方と、If文との比較でした。

 

エラーコードによって処理を分岐させる時など、SelectCase文がよく使われます。
それぞれ使いやすい場面が違いますし、出来ること出来ないこともあります。

 

あれ、どうやって書くんだっけ?となったら、記事を参考にしてみてくださいね。

 

最後までお読みいただき、ありがとうございました。