黙々とC#

"In a mad world of VBA, only the mad are sane" 『VBAという名の狂った世界で狂っているというのなら私の気は確かだ』

switch

本記事は、Excel C# Script入門講座の1記事です。

switch case

複数の条件により処理を分岐させたい場合はswitchステートメントを使用します。

switchステートメントには、1つ以上のswitchセクションが含まれ、各switchセクションには、1つ以上のcaseラベルと、そのあとに続く1つ以上のステートメントのリストが含まれています。具体的には以下の様に書きます。

switch(変数)
{
  case1:
    // 変数の値 == 値1 のとき実行される処理
    break;
  case2:
    // 変数の値 == 値2 のとき実行される処理
    break;
  default:
    // 変数の値がどの値とも異なるとき実行される処理
    break;
}

"switch (変数)" で書かれた変数の値が "case 値:"の値と一致するかを評価し、caseの値と一致した場合にだけ、その次の文を実行します。条件がtrueでないときは、次の条件を調べます。どのcaseの条件にも当てはまらない場合は、"default:"以下の文を実行します。 複数のcaseラベルで同一の定数値を指定することはできません。

各case以下の文の最後にはbraek*1を記載します。

以下の例では、アクティブシートのA1セルに入力された文字により処理を分岐させています。

var a1 = Excel.ActiveWorkbook.ActiveSheet.Range("A1");
var v = a1.Value;

switch(v)
{
  case "りんご":
    a1.Value = "Apple";
    break;
  case "もも":
    a1.Value = "Peach";
    break;
  default:
    a1.Value = "Unknown";
    break;
}

case に指定できる値は、整数型(int)もしくは文字列型(string)のみです。

比較演算子による処理の分岐や、値の範囲指定による分岐はできません。これらの分岐を行いたい場合には、if ~ else if … を利用してください。

フォールスルー禁止の原則

C#では、switchステートメントは、最終セクションも含め、各 switch セクションの最終文ではswitchステートメントの外側、もしくは他のcaseラベルに移動することが必須要件とされています。つまり、他のいくつかの言語とは異なり、コードが1つのswitch セクション実行後に、連続して続くswitchセクションを実行する(フォール スルーする)ことはできません。

フォールスルー禁止の例外

以下のように、caseラベルが連続している場合に限りフォールスルーが可能です。

var a1 = Excel.ActiveWorkbook.ActiveSheet.Range("A1");
var v = a1.Value;

switch(v)
{
  case "Apple": 
  case "apple":
    a1.Value = "りんご";
    break;
  case "Peach":
  case "peach":
    a1.Value = "もも";
    break;
  default:
    a1.Value = "?";
    break;
}

*1:もしくは、goto, return, throwなどのジャンプステートメント