SELECT文は、集計対象レコードのデータの値によって処理を分ける事ができるVBAの基本コードです。分岐条件が多い場合、同じ分岐処理をするIf文よりもコードがスッキリします。
また分岐条件の指定方法にもいくつかの方法がありますが、本記事ではVBA集計業務で使う基本的な分岐条件の指定方法についてお話をしたいと思います。
目次
サンプルファイル紹介
まずはサンプルシートを用意してください。シート名は「SampleSheet01」です(下図)。
SampleSheet01は、ある果物屋さんの商品管理シートを練習用に作ったものです。本記事では、このサンプルシートを使いながら複数のSelect文に関するサンプルコードをご紹介していきます。
文字列データにより条件分岐させるVBAサンプルコード
はじめに分岐条件が文字列の場合のサンプルコードをご紹介します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | Option Explicit 'さくらんぼの仕入先を表示させる Sub Sample016() Dim r As Integer '行(Row)番号を入れる変数 r = 11 'さくらんぼのレコードがある行番号 'レコードの6列目(仕入先)によって処理を分ける Select Case Cells(r, 6) Case "A市場" 'Cells(r,6)が"A市場の場合、次の行を実行 MsgBox Cells(r, 2) & " の仕入先はA市場です" Case "B市場" 'Cells(r,6)が"B市場の場合、次の行を実行 MsgBox Cells(r, 2) & " の仕入先はB市場です" Case "C市場" 'Cells(r,6)が"C市場の場合、次の行を実行 MsgBox Cells(r, 2) & " の仕入先はC市場です" Case "D市場" 'Cells(r,6)が"D市場の場合、次の行を実行 MsgBox Cells(r, 2) & " の仕入先はD市場です" End Select End Sub |
このコードは、文字列を条件として処理を分岐させるサンプルコードです。具体的には、集計対象レコードの仕入先データ(文字列)を判定基準にします。
詳しいコードの説明の前に、試しに実行してみでください。ちゃんと下のように、さくらんぼの仕入先が、ワークシートの内容と一致して表示されましたでしょうか。
ではVBAコードの解説になります。
10~28行目:Select Case ~ End Select
VBAコード10行目の「Select Case」直後には、条件を判定するための基準を指定します。
今回の例では、下図赤枠内のように「Cells(r, 6)」がその判定基準になります。ここで「Cells(r, 6)」は、r行6列目のセルのデータという意味ですので「仕入先」のデータ(文字列)が判定基準になります。
12, 16, 20, 24行目:Case ~
判定基準の分岐条件を書くところになります。
それぞれ、「Case」の後ろには「仕入先」別に4パターンの分岐条件が並べられてますよね。先ほどの判定基準「Cells(r, 6)」の仕入先の内容によって、マッチした分岐条件の次のVBAコードが実行されます。
今回のケースで説明しますと、Cells(r, 6)の「仕入先」は「C市場」ですので、下図赤枠内のコードが実行されます。
If文の時と同様、ちょっとまとめてみました。
If文と同じく、いずれか1条件が満たされれば、他の条件のVBAコードは実行されることはありません。
今回の例でいうと、分岐条件3(C市場)が満たされた結果、③のコードが実行されます。結果的に、他の①、②、④は実行されずに、続きはEnd Selectの先のコードから実行されることになります。
数値データにより条件分岐させるVBAサンプルコード
前項はSelect文の判定基準や分岐条件に文字列を使用しました。今度はそれらに数値を使ういくつかのサンプルコードをご紹介します。
分岐条件に数値を指定するサンプルコード
分岐条件に数値を指定するサンプルコードのご紹介です。Select文のCase以降に指定する分岐条件の方法に、1つあるいは複数の数値を書いて指定する方法があります。
各分岐条件に1つの値を指定するサンプルコード
分岐条件に数値を指定するサンプルコードは、Case以降に1つの数値を指定する書き方が基本になります。では、サンプルコードをご覧ください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 'さくらんぼの原価を表示させる Sub さくらんぼ原価表示() Dim r As Integer '行(Row)番号を入れる変数 r = 11 'さくらんぼのレコードがある行番号 'レコードの4列目(原価)によって処理を分ける Select Case Cells(r, 4) Case 100 MsgBox "原価は100円です" Case 200 MsgBox "原価は200円です" Case Else MsgBox "その他の価格です" End Select End Sub |
実行すると以下のようにさくらんぼの原価が表示されます。
コードの説明については、以下の図と一緒にお話ししますね。

さくらんぼの行番号はr = 11です。よって、「Select Case」の右に記載されている判定基準値Cells(r, 4)(朱書部)は200になります。
つぎに、Case以下の分岐条件を見てみます。Caseの横に1つの数値があります。1段目は100, 2段目は200のように各1つの数値があり、前項で説明しました通り、上から判定基準に照らし合わせて合致した分岐条件の下のVBAコードが実行されます。
具体的には、今回の判定基準は200ですので、2段目の「Case 200」に合致します。よって、VBAコード13行目が実行されて先ほどのメッセージが表示されました。
Case Elseの使い方
今回は3段目の分岐条件に「Case Else」とあります。これは、「その他の条件」と言う意味で使われます。例えば今回の場合、1段目は100, 2段目は200ですので、Case Elseの条件は、「100でも200でもないその他の値」ということになります。
試しにVBAコード5行目のr=11(さくらんぼ)を、r=2に変えて再度実行してみてください。下図のようにりんごの原価30円に対するSelect文での条件判定結果が表示されます。
各分岐条件に複数の値を指定するサンプルコード
こんどは、分岐条件に複数の数値を指定するサンプルコードをご紹介します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | '1つの分岐条件に複数の整数値を指定する Sub さくらんぼの原価表示() Dim r As Integer '行(Row)番号を入れる変数 r = 2 'さくらんぼのレコードがある行番号 'レコードの4列目(原価)によって処理を分ける Select Case Cells(r, 4) Case 10, 20, 30, 40, 50, 60, 70, 80, 90 MsgBox Cells(r, 2) & "の原価は10の倍数で100円未満です" Case 100, 200, 300, 400, 500, 600, 700, 800, 900 MsgBox Cells(r, 2) & "の原価は100の倍数で100円以上1000円未満です" Case Else MsgBox Cells(r, 2) & "の原価は10の倍数で100円以上1000円未満です" End Select End Sub |
上のVBAコードは、商品の原価が10の倍数で100円未満か、100の倍数で1000円未満か、10の倍数で100円以上1000円未満の3つのケースを判別するものです。
条件判定の内容についてはさておき、ここでは分岐条件に複数の数値を指定する書き方をご紹介します。具体的には、1つの分岐条件に対し複数の値が当てはまる場合は、条件となる複数の数値を「,」(カンマ)を使って指定することができます。
分岐条件に数値の範囲を指定するサンプルコード
つぎのサンプルコードは、条件判定に整数値の範囲を指定する場合です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | '在庫個数の範囲を表示する Sub 在庫個数整数値() Dim r As Integer '行(Row)番号を入れる変数 r = 14 'さくらんぼのレコードがある行番号 'レコードの3列目(在庫)によって処理を分ける Select Case Cells(r, 3) Case 1 To 29 '0以上30未満 MsgBox "在庫は0個以上30個未満です" Case 30 To 59 '30以上60未満 MsgBox "在庫は30個以上60個未満です" Case Else '60以上 MsgBox "60個以上!在庫超過!" End Select End Sub |
Caseに複数の数値範囲と複数の数値を混在させて分岐条件を指定する方法
コードの説明については、条件指定に数値や数値範囲を用いる応用的な使い方を含めてつぎの図で説明しますね
サンプルコードでは、Caseの後に整数値の範囲を指定していますが、上図のように、「,」(カンマ)を使い複数の範囲を指定することができます。さらに、数値と数値範囲を混在させて指定することもできます。
分岐条件に数値の範囲を指定するサンプルコード
つぎのサンプルコードは、分岐条件に小数点以下を考慮した場合の指定方法です。
前項までは整数値を中心にサンプルコードをご紹介してきました。今回は、条件判定に使うデータが整数値ではない小数点を含む数値の場合です。
具体的には、サンプルファイルのデータ項目にある「価格更新日」を使ったサンプルコードをご紹介します。ここでサンプルファイル上にある価格更新日を見ますと、日にちまでしか入っておりませんので、一見整数値ではないかともいえそうです。
ところが、データベースなどのデータ作成日時やデータ更新日時などは、一般的にはレコードの作成・更新が行われた日時で記録されますので、何時何分何秒までデータを持つのが普通です。
何時何分何秒については、小数点以下になりますので、今回のサンプルコードを応用することで小数点以下を考慮した分岐判定をすることができます。
それでは、サンプルコードのご紹介です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | '分岐条件に小数以下を考慮した範囲指定 Sub データ更新日() Dim r As Integer '行(Row)番号を入れる変数 r = 11 'さくらんぼのレコードがある行番号 'レコードの7列目(価格更新日)によって処理を分ける Select Case Cells(r, 7) Case Is < #1/1/2019# '2019/1/1より前 MsgBox "データ更新日付は2018年です" Case Is < #2/1/2019# '2019/1/1~2019/1/31 MsgBox "データ更新日時は2019/1/1~2019/1/31です" Case Is < #3/1/2019# '2019/2/1~2019/2/28 MsgBox "データ更新日時は2019/2/1~2019/2/28です" Case Is < #4/1/2019# '2019/3/1~2019/3/31 MsgBox "データ更新日時は2019/3/1~2019/3/31です" Case Else MsgBox "データ更新日は2019/4/1以降です" End Select End Sub |
コードの内容については、下図で説明しますね。
まず条件判定箇所に書かれている「Case Is <」の「Is」ですが、条件判定に等号、不等号を指定する際に自動的に記述されます。
前項までにご紹介した文字列や整数値を判定条件に指定する際にも、「Case Is = "A市場"」や「Case Is = 10」のように、「=」を入力すると「Is」が自動で記述されますが、既にご紹介したサンプルコードのように等号の場合は、等号を省略して記述するほうが可読性がよくなるためおすすめです。
図に戻りますが、今回の条件判定には年月日の不等号を用いることで、小数点以下を含めた値を判別することができます。
具体的には、1段目のCaseから「2019年1月1日未満=2019年1月1日00:00:00より前」というように1秒単位で判別しています。続く2段目のCaseでは「2019年1月1日00:00:00から2019年2月1日00:00:00より前」、さらに3段目のCaseでは「2019年2月1日00:00:00から2019年3月1日00:00:00より前」、4段目のCaseでは「2019年3月1日00:00:00から2019年4月1日00:00:00より前」となります。
そして最後の5段目のCase Elseでは、上記以外となるので「2019年4月1日00:00:00から」という条件指定になります。
まとめ
VBAコードの分岐条件構造を形成する構文Select文について、いくつかの条件分岐指定方法を含めてお話ししました。
今回のサンプルコードでは、さくらんぼの場合の実行結果を中心にお話ししてきましたが、他の商品の行番号を指定して、各自で色々な商品の実行結果を確認したり、実際のコードを手書きで写してみることをおすすめします。
また経験上、Select文もIf文同様大変よく使いますので、ぜひ今回の使い方を基本として使い方を覚えてくださいね。
Tips:Select文以外のVBA基本構文
For ~ Next文(繰り返し)
For Each ~ Next文(繰り返し)
Do ~ Loop文(繰り返し)
If文(分岐)