
複数条件を分岐させる方法として先日If~Then~ElseIfステートメントについて解説しました。
【Excel VBA】If~Then~ElseIfステートメントで複数条件を処理を分岐させる方法 | Excelを制する者は人生を制す ~No Excel No Life~
If~Then~Elseステートメント複数の条件を分岐させることが可能でした。
Excel VBAには他にも類似の条件分岐を設定できるステートメントがあります。
それは「Select~Caseステートメント」です。
今回はSelect~Caseステートメントについて解説していきます。
Select~Caseステートメントの基本構文
1 2 3 4 5 6 7 8 9 10 | Select Case 条件判断対象 Case 条件式1 処理1 Case 条件式2 処理2 ・ ・ Case Else 処理3 End Select |
条件判断対象
条件判断の対象となるオブジェクト(セルやシートやブックなど)を指定します。
以下の条件式はすべて、こちらのオブジェクトに対して判断されることになります。
条件判断を”○は△ですか?”という質問に例えるとすると、”○”の部分が条件判断対象となりますね。
条件式1・2
処理を分岐させる条件を指定します。(条件の詳細の設定方法は下記をご参照ください)
なお、条件判断を”○は△ですか?”という質問にたとえるとすると、”△”の部分が条件式となります。
条件式は2つ以上設定することが可能です。
処理1・2
それぞれの条件を満たした場合(真(TRUE)の場合)に行う処理を指定します。
処理3
すべての条件を満たさない場合(偽(FALSE)の場合)に行う処理を指定します。(「Case Else」の次の行)
ここでは便宜上「処理3」としていますが、条件式の数によって処理の数は変動するため、何番目の処理となるのかは流動的になります。
Select~Caseステートメントの条件の設定方法
以下A・Bは任意の数字を入れて下さい。
- =(等しい)
- 【記述例】Case A
判断対象がAと等しい場合はTRUE - <(より小さい)
- 【記述例】Case Is < A
判断対象がAより小さい場合はTRUE - <=(以下)
- 【記述例】Case Is <= A
判断対象がA以下の場合はTRUE - >(より大きい)
- 【記述例】Case Is > A
判断対象がAより大きい場合はTRUE - >=(以上)
- 【記述例】Case Is >= A
判断対象がA以上の場合はTRUE - ○以上○以下
- 【記述例】Case A To B
判断対象がA以上B以下の場合はTRUE - ○または○
- 【記述例】Case A,B
判断対象がAまたはBの場合はTRUE - 他の条件すべてを満たさない場合
- 【記述例】Case Else
判断対象がすべての条件を満たさない場合(FALSE)
理想は各条件式の内容的に漏れなくダブりがない状況にしておくと良いでしょう。
このような考え方はMECE(ミッシー)といいます。(詳細は下記サイトを参照)
仮に各条件式の内容的にダブりがあった際は、条件式1⇒条件式2⇒・・・のようにコードの上に設定している条件が優先されます。
各条件式の「漏れ」の部分は単純に他の「Case Else」に含まれることになります。
使用例
80点以上で優良者として認定され、40点以上が及第点のテストがあったとします。
B2セルが点数、C2セルが合否欄で、B2セルが80以上の場合はC2セルの値が”◎”、40以上79以内の場合はC2セルの値が”○”に、40未満の場合はC2セルの値が”×”なるように設定します。
1 2 3 4 5 6 7 8 9 10 | Sub 複数条件による分岐() Select Case Range("B2").Value Case Is >= 80 Range("C2").Value = "◎" Case 40 To 79 Range("C2").Value = "○" Case Else Range("C2").Value = "×" End Select End Sub |
2行目の「Select Case」の後が条件判断対象となります。
今回はB2セルが該当しますので「Range(“B2”).Value」となります。
3行目は条件1となります。
今回の条件1は「B2セルが80以上」なので「Case Is >= 80」となります。
続いて4行目が条件1を満たした場合の処理1を記述します。(条件1の真の場合)
処理は「C2セルの値を”◎”にする」なので「Range(“C2”).Value = “◎”」となります。
5行目に条件式2となります。
今回の条件2は「B2セルが40以上」なので「Case 40 To 79」となります。
6行目が条件2を満たした場合の処理2を記述します。(条件2の真の場合)
処理2は「C2セルの値を”○”にする」なので「Range(“C2”).Value = “○”」となります。
7行目に「Case Else」、8行目で条件を満たさない場合の処理を記述します。(条件1・2の偽の場合)
処理3は「C2セルの値を”×”にする」なので「Range(“C2”).Value = “×”」となります。
9行目に「End Select」で締めて終了になります。
マクロの動作イメージ
C2セルが最初はブランクになっています。
マクロを起動すると、B2セルが80以上の値が入っていればC2セルに”◎”の値が返ります。
マクロを起動すると、B2セルが40以上79以内の値が入っていればC2セルに”○”の値が返ります。
そして、B2セルが40未満の値であればC2セルに”×”の値が返ります。
Excel内の類似機能
Select~Caseステートメントに類似したExcelの代表的な機能は以下の2つです。
- IF関数
- VLOOKUP関数
関連記事は下記をご参照ください。
IF関数 | Excelを制する者は人生を制す ~No Excel No Life~
VLOOKUP関数の可変性を持たせる組み合わせまとめ | Excelを制する者は人生を制す ~No Excel No Life~
なお、Select~Caseステートメントは上記のような値や書式などのプロパティに限らず、範囲選択やコピー・消去などのメソッドも設定できるため、より複雑な条件分岐を設定することが可能です(・∀・)
まとめ
Select~CaseステートメントはIfステートメントと同様に「マクロの記録」では設定できず、VBE経由でしか設定できません。
If~Thenステートメントと比べて条件の判断対象が1つの場合に対して複数の条件を設定できるので、コードの見た目的にすっきりします。
次回、IfステートメントとSelect~Caseの使い分けをどうすれば良いかまとめていきます。