黙々とC#

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

goto

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

goto

無条件に処理を分岐させたい場合には、goto ステートメントを使用することができます。ただし、gotoステートメントを多用するとプログラムが分かりにくくなるので積極的には使わない方が良いでしょう。

例えば以下のように使います。

LABEL: // ジャンプ先を示すラベル
var x = 1;
goto LABEL;

//※このサンプルコードは無限ループします

goto ステートメントの使いドコロの1つとしては、階層の深い入れ子のループから抜ける際に使います。

for(var i = 1; i < 100; i++)
{
    for(var j = 1; j < 100; j++)
    {
          if( i > 50 && i == j )
          {
                goto EXITLOOP;
          }
    }
}

EXITLOOP:

goto case

また、goto は switch ステートメントの特定の switch-case ラベルまたは default ラベルに制御を移動するのに使用することができます。

var n = Excel.ActiveWorkbook.ActiveSheet.Range("A1").Value;
var cost = 0;
switch (n)
{
    case 1:
        cost += 25;
        break;
    case 2:
        cost += 25;
        goto case 1;
    case 3:
        cost += 50;
        goto case 1;
    default:
        break;
}

Excel.ActiveWorkbook.ActiveSheet.Range("A2").Value = cost;

return, break

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

return, break

return

C# スクリプトの処理を途中で抜ける場合、returnステートメントを使用します。

var x = 1;
return;    //ここでスクリプト終了

var y = 2; //この処理は実行されない。

なお、メソッド内でreturnを使用した場合は、通常のC#と同様、当該メソッドを抜けるのみです。

break

whileステートメントやforステートメントを処理途中で抜けるには、breakステートメントを使用します。

for(var i = 1; i < 100 ; i++)
{
    if( i = 10) { break; }
}

using

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

using

usingステートメントは、IDisposableインターフェースを実装したオブジェクトを呼び出した際に、確実にDispposeメソッドが呼ばれるように保証するための簡易構文です。

#r "System.Drawing"
using System.Drawing;

using (var font1 = new Font("Arial", 10.0f)) 
{
    var charset = font1.GdiCharSet;
}

上記例のFontオブジェクトのように、アンマネージ リソース (この場合はデバイス コンテキスト) にアクセスするマネージ型の例です。アンマネージ リソースや、それをカプセル化するクラス ライブラリ型は他にもたくさんあります。そのような型はすべて、IDisposable インターフェイスを実装する必要があります。

一般に、IDisposable オブジェクトを使用するときは、それを using ステートメントで宣言して、インスタンス化する必要があります。 using ステートメントは、ステートメントブロックを抜けると必ず Dispose メソッドを呼び出します。 Disposeメソッド が呼び出されるとすぐに、オブジェクト自体がスコープの外側に出されます。 オブジェクトは、using ブロック内では読み取り専用です。変更したり再割り当てしたりすることはできません。

using ステートメントを使うと、オブジェクトでのメソッドの呼び出し中に例外が発生した場合でも Dispose が必ず呼び出されます。 usingステートメントは、オブジェクトを try ブロックに配置し、finally ブロックで Dispose を呼び出すコードと等価です。

while

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

while

条件により処理を繰り返したい場合、whileステートメントを使用します。

while は"while (条件式)"の形式で条件を指定します。条件式がtrueの間、処理が実行されます。 従って、通常は処理の中でwhile文の条件式がfalseになるようにしたり、 繰り返しを中断するような文を記述します。そうでないとwhile文は処理を永遠にし続けてしまうからです。

"while ( 条件式 )"は、2通りの記述方法があります。記述方法により処理内容が異なってきます。

while 文

以下のように、whileの位置を前にした場合、条件式を満たしているのかを判断してから 繰り返す処理を実行します。

while ( 条件式 )
{
  //繰り返す処理
}

なお、C# (C# Script)にuntilは存在しません。論理演算子 ! を用いて条件を否定の形にして下さい。

下記の例では、まず初期値として変数 i に 1 が代入しておき、次に i が11以下かどうかを評価し、セルに値を代入し、次に i の値を1つ加算し、 もう一度 i が11以下かどうかを評価し、セルに値を代入します。この処理を i が10以上になるまで繰り返します。

var i = 1;
while ( i < 11 )
{
  Excel.Worksheets("Sheet1").Cells(i, 1).Value = i;
  i++;
}

do while文

上記記述方法に対してwhileの位置を後ろにした場合、繰り返す処理を実行してから 条件式を満たしているか判断します。つまりどのような条件でも1回は繰り返す処理 を実行します。

do
{
  //繰り返す処理
}
while(条件式);

なお、この記述方法を用いる場合、while(条件式)の末尾に ; (セミコロン)が必要です。

下記の例では、まず初期値として変数 i に 10 が代入しておき、セルに値を代入し、次に i の値を1つ加算し、 i が11以下かどうかを評価します。つまりWhile 条件式を評価する前に処理を 1回実行しています。i の値は11なので 繰り返す処理を実行せずに終了します。

var i = 10;
do
{
  Excel.Worksheets("Sheet1").Cells(i, 1).Value = i;
  i++;
}
while(i < 11);

for

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

for

条件により同じ処理を繰り返したい場合(反復処理を行いたい場合)には、forステートメントが利用できます。

for(初期化式; 条件式; 更新式)
{
  //反復処理
}

下記の例では、まず変数iに1が代入され(「初期化式」)、次にiが10以上かどうかを評価し(「条件式」)、セルに値を代入し(「反復処理」)、次にiの値を1つ加算し(「更新式」)、再度、iが10以上かどうか評価し(「条件式」)、セルに値を代入し(「反復処理」)、…という処理を繰り返します。この処理は、iが10以上になるまで繰り返されます。

for(var i = 1; i <= 10; i++)
{
    Excel.Worksheets("Sheet1").Cells(i, 1).Value = i.ToString();
}

上記例からも分かるように、初期化式は、for文で反復処理に入る前に1度だけ実行されます。

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などのジャンプステートメント

if ~ else

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

if ~ else

条件により処理を分岐させたい場合は、if ~ else ステートメントを使用します。

ifは、"if (condition)" の形式で条件を調べて、 条件式がtrueである場合に続くステートメントを実行します。条件がtrue出ない場合には、else に続くステートメントを実行します。

bool condition; // true または falseが代入される

if (condition) 
{
    // condition がtrueの場合に実行される
}
else
{
    // condition がfalseの場合に実行される
}

条件によって、2つ以上に処理を分岐させたい場合には、 if ステートメントをelseブロック内に入れ子にすることができます。

bool condition1; // true または falseが代入される
bool condition2; // true または falseが代入される

if (condition1) 
{
    // condition1 がtrueの場合に実行される
}
else if (condition2)
{
    // condition1 がfalseで、 condition2 がtrueの場合に実行される
}
else
{
    // condition1 及びcondition2がfalseの場合に実行される
}

関係演算子と等値演算子

条件式でよく使われる演算子には、以下の関係演算子及び等値演算子があります。

概要
x < y xがyより小さい場合true
x > y xがyより大きい場合true
x <= y xがy以下の場合true
x >= y xがy以上の場合true
x == y xとyが等しい場合にtrue。string以外の参照型の場合、参照の等価性を調べます。
x != y xがyと等しくない場合true。==と同様。

型検査演算子

この他にも、型検査演算子があります。

概要
is 型の互換性を調べます。評価される左側のオペランドを右側のオペランドで指定された型にキャスト出来る場合、trueとなります。
as 型変換。左側のオペランドを右側のオペランドで指定された型にキャストして返します。変換可能でない場合、nullが返ってきます。

論理演算子

概要
x && y 論理AND。最初のオペランドがfalseの場合、2番目のオペランドは評価されません。
x | y |論理 OR。 最初のオペランドが true の場合、2番目のオペランドが評価されません。

単項演算子

概要
!x 論理否定