Excel VBAでCase文の使い方をお探しですね。
Excel VBAで条件分岐を書くとき、最初に思い浮かぶのはIf文ですよね。
ただ、条件が3つ、4つ、5つと増えてくると、ElseIfが長く続いてコードがごちゃごちゃしてきます。
そんなときに便利なのが**Select Case文**です。
この記事では、Excel VBAのSelect Case文の使い方を、基本的な書き方から複数条件、範囲指定、If文との使い分けまで、初心者にも分かりやすく解説します。
「分岐が多いVBAコードをスッキリ書きたい」「If文とSelect Case文の違いを知りたい」という方は、ぜひ参考にしてください。
広告
Excel VBAのSelect Case文とは?If文よりもスッキリ多分岐を書ける条件分岐
Select Case文は、1つの値をいくつかの条件と見比べて、条件に合う処理だけを実行するための書き方です。
Excel VBAでは、条件によって処理を変えたい場面がとても多くあります。
たとえば、セルの値が「A」なら合格、「B」なら再確認、「C」なら不合格と表示する処理や、点数によって評価を分ける処理などです。
こういった分岐はIf文でも書けるんですが、条件が増えるほどElseIfがズラズラ続いて、どこで何を判定しているのか分かりにくくなってしまいます。
Select Case文を使うと、比較する対象を最初に1回だけ指定して、その後にCaseごとの条件を並べて書けるので、分岐の全体像が見やすくなります。
基本的な考え方は「Select Caseで調べたい値を指定して、Caseで条件を並べる」というものです。
たとえば、変数statusの値によってメッセージを変える場合、If文では「status = “A”」「status = “B”」のように毎回比較対象を書きます。
でも、Select Case文では最初にstatusを指定するので、各Caseには「”A”」「”B”」のように条件だけを書けばOKです。
そのため、同じ変数やセルの値を基準にして多分岐する処理では、Select Case文のほうが読みやすくて、あとから修正しやすいコードになります。
構文は次のとおりです。
“`vb
Select Case 比較する値
Case 条件1
条件1に一致したときの処理
Case 条件2
条件2に一致したときの処理
Case Else
どの条件にも一致しなかったときの処理
End Select
“`
**Case Else**は、どのCaseにも当てはまらなかった場合に実行される処理です。
必ず書かないといけないわけではありませんが、想定外の値が入ったときの処理を書いておくと、マクロの動きが分かりやすくなります。
特に実務では、入力ミスや空欄、想定していない文字列が混ざることがあるので、Case Elseを用意しておくと不具合の発見にも役立ちます。
Select Case文の基本的な使い方:値の一致と複数条件を判定する
まずは、一番基本的な「値が一致するか」を判定する書き方から見ていきましょう。
次の例では、変数rankに入っている文字によって、表示するメッセージを変えています。
Select Case rankと書くことで、rankの中身をCaseごとの条件と順番に比較します。
rankが”A”なら「優秀です」、”B”なら「標準です」、”C”なら「確認が必要です」と表示されます。
“`vb
Sub SampleSelectCaseBasic()
Dim rank As String
rank = “B”
Select Case rank
Case “A”
Debug.Print “優秀です”
Case “B”
Debug.Print “標準です”
Case “C”
Debug.Print “確認が必要です”
Case Else
Debug.Print “判定できないランクです”
End Select
End Sub
“`
このコードではrankの値が”B”なので、Case “B”の処理だけが実行されます。
Select Case文では、条件に一致したCaseの処理を実行すると、その後のCaseは判定されずにEnd Selectまでジャンプします。
つまり、1つのSelect Case文の中で実行される分岐は基本的に1つだけです。
複数の条件に当てはまる可能性がある場合でも、最初に一致したCaseだけが実行される点は覚えておきましょう。
複数の値を同じ処理にまとめたい場合は、Caseの後ろにカンマ区切りで値を並べます。
たとえば、曜日によって平日か休日かを判定する場合、月曜から金曜までは同じ処理にできますよね。
If文で書くと「dayName = “月” Or dayName = “火”」のように長くなりますが、Select Case文なら同じグループの値を横に並べるだけで表現できます。
“`vb
Sub SampleSelectCaseMultipleValues()
Dim dayName As String
dayName = “土”
Select Case dayName
Case “月”, “火”, “水”, “木”, “金”
Debug.Print “平日です”
Case “土”, “日”
Debug.Print “休日です”
Case Else
Debug.Print “曜日を確認してください”
End Select
End Sub
“`
このように、同じ処理をする条件を1つのCaseにまとめると、コードの重複を減らせます。
特に、セルに入力された区分やステータスを判定するマクロでは、似たような条件が増えやすいので、カンマ区切りの指定はよく使います。
ただし、あまりにも多くの値を1行に詰め込むと逆に読みにくくなるので、条件の意味が分かる単位でまとめることが大切です。
読みやすさを優先するなら、必要に応じてコメントを添えるのも良いでしょう。
To・Is・Select Case Trueを使った応用:範囲指定や大小比較もできる
Select Case文は、単純な値の一致だけでなく、数値の範囲や大小比較にも対応できます。
点数や年齢、売上金額のように「何点以上ならA」「何歳から何歳までなら大人」といった判定をしたい場合は、**To**や**Is**を使うとスッキリ書けます。
Toは範囲指定に使い、「Case 0 To 59」のように書くと、0以上59以下に当てはまる場合を表します。
If文で同じことを書くと「score >= 0 And score <= 59」のようになりますが、Select Case文では範囲そのものを直感的に表現できます。 ```vb Sub SampleSelectCaseTo() Dim score As Long score = 82 Select Case score Case 0 To 59 Debug.Print "不合格です" Case 60 To 79 Debug.Print "合格です" Case 80 To 100 Debug.Print "高得点です" Case Else Debug.Print "点数の範囲を確認してください" End Select End Sub ``` Toを使うときは、左側に小さい値、右側に大きい値を書きます。 たとえば「Case 100 To 80」のように逆順で書くと、意図した範囲判定になりません。 エラーとして分かりやすく止まるとは限らないので、範囲指定では下限から上限の順に書くことを習慣にすると安全です。 また、複数の範囲が重ならないようにすることも大切です。 重なっている場合は、先に書かれたCaseが優先されるので、後ろのCaseが実行されないことがあります。 一方、特定の値以上、以下、より大きい、より小さいといった条件を書きたい場合は、**Case Is**を使います。 ここで使うIsは、Select Case文の中で比較条件を書くためのキーワードです。 たとえば「Case Is >= 100」は、Select Caseで指定した値が100以上なら該当する、という意味になります。
Excel VBAではオブジェクト比較でもIsを使いますが、Select Case内のCase Isは大小比較のために使うものと理解すると良いでしょう。
“`vb
Sub SampleSelectCaseIs()
Dim amount As Long
amount = 150000
Select Case amount
Case Is >= 100000
Debug.Print “大口注文です”
Case Is >= 50000
Debug.Print “通常注文です”
Case Is > 0
Debug.Print “小口注文です”
Case Else
Debug.Print “金額を確認してください”
End Select
End Sub
“`
この例では、amountが150000なので最初のCase Is >= 100000に一致し、「大口注文です」と表示されます。
ここで注意したいのは、**条件の順番**です。
もしCase Is > 0を先頭に書くと、150000も0より大きいので、そこで一致してしまいます。
その結果、後ろにある「100000以上」の判定には進みません。
大きい範囲から判定するのか、小さい範囲から判定するのかを事前に決めて、重なりがある場合はより限定的な条件を先に書くのが基本です。
さらに応用として、**Select Case True**という書き方もあります。
これは、Case側に「条件式そのもの」を書きたいときに使います。
通常のSelect Case文は、Select Caseで指定した値とCaseの値を比較します。
でも、文字列の一部一致や複数の変数を使った条件など、単純な値比較では表しにくい場合があります。
そんなときにSelect Case Trueと書くと、各Caseに書いた条件式がTrueになるかどうかで分岐できます。
“`vb
Sub SampleSelectCaseTrue()
Dim productName As String
Dim stock As Long
productName = “A-001”
stock = 3
Select Case True
Case productName Like “A*” And stock = 0
Debug.Print “A商品は在庫切れです”
Case productName Like “A*” And stock <= 5
Debug.Print "A商品は在庫が少なくなっています"
Case productName Like "B*"
Debug.Print "B商品です"
Case Else
Debug.Print "その他の商品です"
End Select
End Sub
```
Select Case Trueは便利ですが、何でもこの形にすれば良いわけではありません。
条件式が複雑になりすぎると、If文で書いたほうが自然な場合もあります。
Select Case文の強みは、同じ対象を基準にした分岐を見やすく整理できる点です。
複数の変数や複雑な論理条件が中心になる場合は、Select Case Trueにするか、If文にするかを読みやすさで判断すると良いでしょう。
If文との使い分けと注意点:読みやすいVBAコードにするコツ
Select Case文とIf文は、どちらが常に優れているというものではありません。
基本的には、条件が少ない場合や複数の変数を組み合わせる場合はIf文、1つの値を基準にして複数の分岐を行う場合はSelect Case文が向いています。
たとえば「セルA1が空欄なら処理する」「金額が0より大きくて、かつ日付が今日以降なら処理する」といった条件はIf文のほうが素直に書けます。
一方、「区分がAなら処理1、Bなら処理2、Cなら処理3」のような多分岐はSelect Case文のほうが整理しやすいです。
If文とSelect Case文の使い分けは、次のように考えると判断しやすくなります。
– 分岐が1〜2個程度ならIf文で十分
– 同じ変数やセルの値を基準に3個以上へ分岐するならSelect Case文が向いている
– 複数の変数を組み合わせた複雑な条件ならIf文、またはSelect Case Trueを検討
– 後から条件を追加・変更する可能性が高い処理では、一覧性の高いSelect Case文が便利
実務でよくあるのは、最初はIf文で短く書いていた処理が、あとから条件追加を重ねて読みにくくなるケースです。
たとえば、ステータスが「未処理」「処理中」「完了」「差戻し」「保留」などに増えていくと、ElseIfが長く続きます。
その場合は、Select Case文に書き換えることで、条件と処理の対応関係が見やすくなります。
特に、他の人が読むマクロや、数か月後に自分が修正するマクロでは、処理速度のわずかな差よりも、コードの読みやすさや修正しやすさが重要になる場面が多いです。
ただし、Select Case文を使うときにはいくつか注意点があります。
まず、複数のCaseに当てはまる値がある場合、**最初に一致したCaseだけが実行されます**。
これは便利な性質でもありますが、条件の順番を間違えると想定と違う処理になる原因にもなります。
次のようなコードでは、scoreが85の場合、最初の「60以上」に一致するため、「合格です」と表示され、後ろの「80以上」のCaseには進みません。
“`vb
Sub SampleSelectCaseOrder()
Dim score As Long
score = 85
Select Case score
Case Is >= 60
Debug.Print “合格です”
Case Is >= 80
Debug.Print “高得点です”
Case Else
Debug.Print “不合格です”
End Select
End Sub
“`
この場合、「80以上」を優先して判定したいなら、Case Is >= 80を先に書く必要があります。
条件が重なる可能性があるときは、より狭い条件、または優先度の高い条件を上に置くのが基本です。
また、Case Elseを省略すると、どの条件にも当てはまらなかったときに何も起きません。
意図的に何もしないなら問題ありませんが、入力ミスを見逃す原因にもなるので、初心者のうちはCase Elseを書いておくことをおすすめします。
最後に、実際のExcel業務での使いどころをイメージしておくと、Select Case文を自然に使えるようになります。
たとえば、セルに入力された部署名ごとに処理を変える、商品コードの先頭文字で分類する、点数や金額の範囲でランクを付ける、ステータスに応じてセルの色やメッセージを変える、といった処理です。
いずれも、分岐が増えやすくて、If文だけで書くと長くなりやすい場面です。
Select Case文を使えば、条件を上から順番に確認しやすくなって、あとからCaseを追加するのも簡単です。
Excel VBAのSelect Case文は、多分岐をスッキリ書くための強力な構文です。
値の一致にはCase、複数値にはカンマ区切り、範囲指定にはTo、大小比較にはCase Is、複雑な条件にはSelect Case Trueを使うことで、さまざまな条件分岐に対応できます。
If文とSelect Case文のどちらを使うか迷ったときは、「同じ値を基準に複数へ分けるならSelect Case文」と考えると判断しやすいです。
読みやすい条件分岐を書けるようになると、VBAマクロの保守性が上がって、実務での修正や機能追加も進めやすくなります。
広告
