黙々とC#

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

コレクション(配列・リスト)

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

コレクション(配列・リスト)

配列

配列とは、一つの変数に対して複数の同じ型のデータを格納する場合に使用します。

配列は、以下のようにして宣言することが出来ます。

型名[] 変数名;

また、利用にあたっては、初期化が必要です。ここでは、配列の実体を生成する(サイズを決定する)必要があります。配列のサイズは以下のようにして決定します。

変数名 = new 型名[配列の長さ]

なお、C# Script(C#3.0以降)では、以下のように型名を省略して初期化することが可能です。

var a = new[]{0, 1, 2, 3};
var b = new[]{"C#", "VBA", "VB.NET"};

また、配列の型を明示して宣言する場合には、new[] を省略することも可能です。

int[] a = {0, 1, 2, 3};

なお、配列の各要素には、以下のようにしてアクセスすることができます。

変数名[要素番号]

要素番号は「0」から始まります。例えば「var a = new string[3];」と初期化すると、要素数は「0」から「2」の「3つ」となります。配列にデータを代入する場合は、「変数名[要素番号] = データ」で代入できます。

リスト

リストは、要素を順番に保持するコレクションクラスです。動的に要素の数を増減できるという特徴があり、動的配列のように扱うことができます。

リストは、型名を指定して宣言・初期化することができます。

var 変数名 = new List<型名>();

配列のように、要素番号を指定して各要素にアクセス可能です。

var list = List<string>(){"C#", "VBA", "VB.NET"};
list[1] = "F#"; //2つ目の要素に値を設定
list.Add("PowerShell"); //要素を追加

他にもコレクションを便利に扱うためのメソッドが用意されています。詳しくはMSDNを参照して下さい。

変数のスコープ

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

変数のスコープ

C# スクリプトにおいてクラス、メソッドで囲むこと無く直接宣言された変数は、publicな変数となり、スクリプトのいかなる箇所からでも参照可能となります。なお、static変数を宣言した場合、スクリプトの実行インスタンスを使い回す限りにおいて、値が保持されます。

なお、メソッド内で宣言された変数は、そのメソッド内でのみ参照可能です。また、クラス内で宣言された変数は、そのクラス内でのみ参照可能です。

アクセス修飾子

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

アクセス修飾子

C# Scriptでは、直接記載したメソッドやクラスのアクセス修飾子は、明示しなかった場合 publicとなります。

すなわち、#load で他のスクリプトファイル(*.csx)を読み込んだ際には、他のスクリプトファイルにおいてアクセス修飾子が明示されていないメソッドやクラスを参照することが可能です。

メソッド、クラスの宣言

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

メソッド、クラスの宣言

C# Scriptでは、メソッドの定義を直接書き始めることが可能です。

test();

void test(){
    var a1 = Excel.ActiveWorkbook.ActiveSheet.Range("A1")
    a1.Value = "C# Script Test";
}

クラスの定義もどこにかいても大丈夫です。

var d = new D();
d.method();

class D
{
   public void method()
   {
        var a1 = Excel.ActiveWorkbook.ActiveSheet.Range("A1")
        a1.Value = "C# Script Test";
   }  
}

C# Script環境では、クラスなどで囲まずに直接記載したコードは、Roslyn内部でコード生成された際に、 いい感じにスクリプト全体を囲うクラスが作られ実行されます。

拡張メソッドの宣言

拡張メソッドはクラスを宣言せずに、直接スクリプト中で宣言します。

using System;
 
static void ShowInA1(this string msg)
{
    var a1 = Excel.ActiveWorkbook.ActiveSheet.Range("A1")
    a1.Value = msg;
}
 
"Hello World".ShowInA1();

上述の通り、Roslyn内部でコード生成された際に、 スクリプト全体を囲うクラスが作られるため、クラスを宣言してしまうと入れ子状にクラスが宣言されてしまい、コンパイルエラーが発生します。

演算子と計算

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

演算子と計算

計算を行うには、演算子を用います。算術計算を行うにあたっては、演算子の中の「算術演算子」を用います。

演算結果を変数に代入するには、= (半角イコール)を用います。

変数 = 値 <演算子> 値

算術演算子

2つのオペランドをとる2項演算子として、以下の組み込みの算術演算子が用意されています。これらの演算子はすべての数値型に対して利用可能です。

意味 利用例
+ 加算 var a = 11 + 12;
- 減算 var b = 2 - 3;
* 乗算 var c = 3 * 7;
/ 除算 var d = 9 / 2;
% 余り var e = 8 % 3;

インクリメント、デクリメント

単項演算子として以下の組み込みの算術演算子が用意されています。

前置き演算子の演算結果は、インクリメント/デクリメントを実行したのオペランドの値となります。

一方、後置き演算子の場合、インクリメント/デクリメントを実行するのオペランドの値となります。

意味 概要
++x 前置きインクリメント xを1増やす
x++ 後置きインクリメント xを1増やす(ただし演算結果は1増やす前の値)
--x 前置きデクリメント xを1減らす
x-- 後置きデクリメント xを1減らす(ただし演算結果は1減らす前の値)

変数の型(クラス)

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

変数の型(クラス)

C# Scriptでは、宣言した変数には必ずデータの型(クラス)を指定する必要があります。データの型(クラス)とは、変数に格納できるデータの種類をいいます。

なお、var (型推論)は、何でも代入できる型ではなく、コンパイル時に右辺の値から型(クラス)を自動的に決定する仕組みです。コンパイル時に一意に型(クラス)が決定されます。このため、一度型が決定された後、異なる型のデータを代入することはできません。

数値を代入できる変数を宣言する場合

名称 格納できる値の範囲
int 32bit 整数型 -2,147,483,648 ~ 2,147,483,647
long 64bit 整数型 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
float 単精度浮動小数点型 精度7桁; ±1.5 × 10-45~ ±3.4 × 1038
double 倍精度浮動小数点型 精度15桁; ±5.0 × 10-324~ ±1.7 × 10308
decimal 10進小数 精度28桁; 1.0 × 10-28~ 7.9 × 1028

他、整数型に関しては、8,16,32,64bitのサイズそれぞれに符号有り無しが用意されています。

また、8バイト(64bit)より大きな整数値を扱いたい場合には、System.Numerics名前空間に属するBigInteger構造体を利用できます。

サンプルコード

数値に適宜suffixを付けることで、型を指定することができます。

var i = 351;     //32bit整数型 int
var j = 1879L;   //64bit整数型 long
var k = 2.7123f; //単精度浮動小数点型 float
var l = 2.233;   //倍精度浮動小数点型 double
var m = 6.02e23; //指数表記OK。(=6.02×10^23) 倍精度浮動小数点型 double
var n = 99.9m;   //10進小数 decimal

文字列を代入できる変数を宣言する場合

String型は、System.Char型のシーケンシャルコレクションとなっています。文字エンコーディングはUTF-16となります。

なお、stringオブジェクトはimmutableで、1度生成した後は変更ができません。変更を加えるようなメソッドを呼び出すと、変更が加えられた後の文字列を示す新たなstringオブジェクトが生成されます。

名称 格納できる値の範囲
string 文字列型 最大サイズ2GB。約10億文字
サンプルコード
var x = "hoge";

var y = @"C:\TEST\hoge\foo"; //@を先頭につけると \ をそのまま記載可能
var yy = @"
line1:
line2:
"; //複数行の記載も可能

var z = $"{x} is hoge"; //$ を先頭につけると文字列挿入。string.Formatと等価。
var i = 100;
var zz = $"{i,9:C}円の商品"; //書式指定も可能
var zzz = $@"
{x}
{y}
{z}
"; //$@ を先頭につけると複数行の文字列挿入が可能

日付・時刻を代入できる変数を宣言する場合

名称 格納できる値の範囲
DateTime 日時 を示すオブジェクト 西暦1年1/1 0:00 ~ 西暦9999年12/31 23:59。時刻は100ns単位。
TimeSpan 時間 を示すオブジェクト 日、時、分、秒、ミリ秒をintで指定が可能

日時の演算については、下記の記事を参照して下さい。

mokumokucsharp.hateblo.jp

オブジェクトを代入できる変数を宣言する場合

名称 格納できる値の範囲
object オブジェクト型 C#では全てのオブジェクトがobject型の派生のため、ボクシングによりobject型変数に代入可能。参照型。
dynamic ダイナミック型 静的な型に対する動的コード生成を行う型。型チェックやメンバの有無を、コンパイル時ではなく実行時にチェックする。

なお、ExcelCSXでは、デフォルトで#rやusing宣言なしにdynamic型を利用可能。

真偽値を代入できる変数を宣言する場合

名称 格納できる値の範囲
bool ブール型 true または false