黙々とC#

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

演算子と計算

本記事は、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

変数

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

変数

変数は、数値や文字列、オブジェクトを一時的に格納する入れものです。

スクリプト内で変数を利用する際は、まず、変数を宣言します。変数の宣言は、

利用したい変数のクラス名 変数名

のように行います。

int i;
string str;

変数に値を代入するには = (半角イコール)を使用します。

int i;
i = 5;

なお、C# Scriptでは、宣言と同時に値の代入(初期化)が可能です。

int i = 5;

また、クラス名を記載する代わりに、var (型推論)を使うことが可能です。varを使うとより手軽にスクリプトを書けるので、積極的に使っていきたいところです。

var i = 5;

なお、C# Scriptでは、変数を宣言せずにスクリプト中で、いきなり変数を利用することはできません。変数名のtypoなど誤って違う変数名で指定した場合、コンパイルエラーが発生するため、スクリプト実行前にエラーを発見することが可能です。

日付・時間

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

日付・時間

日付時刻を扱うためのDateTimeオブジェクトを利用するには using System; の宣言を追加する必要あり。

現在の日付・時間

DateTime.Now プロパティで、コンピューター上の現在の日時を現地時刻で表した DateTime オブジェクトを取得できる。

文字列に変換するにあたっては、ToString()の引数でカスタム日時書式.aspx)を指定可能。

using System;

var x = DateTime.Now.ToString();
Excel.ActiveWorkbook.ActiveSheet.Range("A1").Value = x;


var date = DateTime.Now.ToString("yyyy/MM/dd"); //日付のみ取得
var time = DateTime.Now.ToString("HH:mm:ss"); //時刻のみ取得

年・月・日・時・分・秒の取得

DateTimeオブジェクトのプロパティが用意されています。

var d = DateTime.Now;
d.Year;
d.Month;
d.Day;
d.Hour;
d.Minute;
d.Second;
d.DayOfWeek; //曜日を取得

日付の加算・減算

減算するときはマイナス値を指定。

var d = DateTime.Now;
var d1 = d.AddYears(1); //年の加減算
var d2 = d.AddMonths(1); //月の加減算
var d3 = d.AddDays(1); //日の加減算

他、AddHours, AddMinutes, AddSecondsメソッドなどあり。

DateTimeオブジェクトのAddもしくはSubstractメソッドの引数にTimeSpan構造体を指定しても可。

文字列操作

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

文字列操作

文字列の置換

var str = "No VBA, No Life.";
var replacedStr = str.Replace("VBA","C#");

文字列の文字数

var str = "No C#, No Life.";
var l = str.Length;

部分文字列の取得

var str = "No C#, No Life.";
//指定した位置から末尾まで取得
var substr = str.Substring(6);

//指定した位置から指定文字数だけ取得
var substr2 = str.Substring(6,2);

特定の文字/文字列の位置の取得

var str = "No C#, No Life.";
var i = str.IndexOf("C#");

文字列が見つかった場合は、value の 0 から始まるインデックスでの位置。見つからなかった場合は -1。

引数 が String.Empty の場合、戻り値は 0 。

なお、LastIndexOfメソッドを用いると、引数の文字列が最後に見つかった位置を取得できる。

var str = "No C#, No Life.";
var i = str.LastIndexOf("No");

ファイル/フォルダの操作

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

ファイル/フォルダの操作

ファイルのコピーや削除など、ファイルに関する操作を行う場合には、System.IO名前空間のFileクラス.aspx)を利用します。

また、フォルダの作成や削除など、フォルダに関する操作を行う場合には、System.IO名前空間のDirectoryクラス.aspx)を利用します。

System.IO名前空間はmscorelib内に含まれているため、参照の追加は必要ありません。利用にあたっては、using宣言のみ追加してください。

ファイル操作

ファイルのコピー

第3引数にtrueを指定すると、上書きコピーを実行。

using System.IO;
//既にコピー先にファイルが存在する場合、エラー発生
File.Copy("sample.txt", "copy.txt");
//既にコピー先にファイルが存在する場合、上書き
File.Copy("sample.txt", "copy.txt", true);
ファイルの削除
using System.IO;
File.Delete("sample.txt");
ファイルが存在するかの確認

ファイルが存在する場合true、存在しない場合・もしくはエラーが発生した場合falseが返されます。

using System.IO;
var b = File.Exists(@"sample.txt");
ファイルの移動・名前の変更

ファイルが存在する場合true、存在しない場合・もしくはエラーが発生した場合falseが返されます。

using System.IO;
File.Move(@"sample.txt", @"sample2.txt");

フォルダ操作

フォルダの作成

親フォルダが存在しない場合、自動的に作成する。

既にフォルダが存在する場合は何もしない。

なお、戻り値として、 System.IO.DirectoryInfo型のオブジェクトが返る。このオブジェクトは指定したパスに存在するディレクトリを表す。

using System.IO;
var di = Directory.CreateDirectory(@"C:\TEST\SUB");
フォルダの削除

第2引数にtrueを指定しない限り、空の状態でないと削除されない。

削除対象が見つからない場合はエラーが発生。

using System.IO;
//サブディレクトリ・ファイルが存在する場合削除しない
Directory.Delete(@"C:\TEST");
//サブディレクトリ・ファイルが存在する場合でも削除する
Directory.Delete(@"C:\TEST", true);
フォルダの移動・名前の変更
using System.IO;
Directory.Move(@"C:\TEST\SUB", @"C:\TEST\SUB2");

なお、CreateDirectoryメソッドと異なり、親ディレクトリの自動作成は行わないので注意。

フォルダが存在するかの確認

ディレクトリが存在する場合true、存在しない場合・もしくはエラーが発生した場合falseが返されます。

using System.IO;
var b = Directory.Exists(@"C:\TEST\SUB");
フォルダに含まれるファイルの取得

いずれのメソッドも第2引数で、文字列エンコーディングを指定可能です。

なお、文字列エンコーディングを指定するためのEncodingクラスは、System.Text名前空間に属するため、利用にあたってはusing宣言を追加してください。

using System.IO;
using System.Text;

var filename = "test.txt";
var tempArray = File.ReadAllLines(filename, Encoding.GetEncoding("Shift_JIS"));

ファイルの入出力

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

ファイルの入出力

ファイル(特にテキストファイル)を読み書きしたい場合には、System.IO名前空間のFileクラス.aspx)を利用します。

System.IO名前空間はmscorelib内に含まれているため、参照の追加は必要ありません。利用にあたっては、using宣言のみ追加してください。

以下で紹介するメソッドを利用する限りは、ファイルを開く・閉じるといった操作は別途必要ありません。

ファイルの読み出し

File.ReadAllLinesメソッドでは、テキストファイルの各行を一文字列とした、文字列型の配列が返されます。

File.ReadAllTextメソッドでは、テキストファイル全文を一文字列とした、文字列が返されます。

using System.IO;

var filename = "test.txt";
var tempArray = File.ReadAllLines(filename);

var temp = File.ReadAllText(filename);

いずれのメソッドも第2引数で、文字列エンコーディングを指定可能です。

なお、文字列エンコーディングを指定するためのEncodingクラスは、System.Text名前空間に属するため、利用にあたってはusing宣言を追加してください。

using System.IO;
using System.Text;

var filename = "test.txt";
var tempArray = File.ReadAllLines(filename, Encoding.GetEncoding("Shift_JIS"));

ファイルの書き出し

File.WriteAllText メソッドを使うと、新しいファイルを作成し、第2引数の文字列をそのファイルに書き込んだ後、ファイルを閉じます。既存のターゲット ファイルは上書きされます。

File.WriteAllLines メソッドを使うと、第2引数の文字列型の配列をファイルに書き込みます。

using System.IO;

var filename = "test.txt";
var s = "love C#.";
File.WriteAllText(filename, s);

var filename2 = "test2.txt";
var arr = {"C#", "VBA", "C#", "VBA"};
File.WriteAllLines(filename2, arr);

いずれのメソッドも第3引数で、文字列エンコーディングを指定可能です。

using System.IO;
using System.Text;

var filename = "test.txt";
var s = "love C#.";
File.WriteAllText(filename, s, Encoding.GetEncoding(932));

ファイルの追記

File.AppendAllTextメソッドを使うと、既存ファイルの末尾に引数で指定した文字列を追加します。ファイルがまだ存在しない場合は、ファイルを作成します。第3引数で、文字列エンコーディングを指定可能です。

using System.IO;

var filename = "test.txt";
var s = "love C# Script.";
File.AppendAllText(filename, s);