黙々とC#

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

変数

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

ワークブックの保存

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

ワークブックの保存

ワークブックの保存には、WorkbookオブジェクトのSaveAsメソッドもしくはSaveメソッドを使用します。

SaveAsメソッドは「名前をつけて保存」に、Saveメソッドは「上書き保存」に対応します。

SaveAsメソッドは複数の引数をとり、保存ファイル名や、ファイル形式、パスワードなどを指定することができます。

SaveAsメソッドの構文

SaveAsメソッドの引数はかなり数が多いため、詳しくはMSDNを参照してください。

(Workbookオブジェクト).SaveAs(各種引数)

以下では、主要な引数のみ解説します。

SaveAsメソッドの引数

引数名 必須 / オプション 内容
Filename 省略可能 保存するファイルの名前を表す文字列を指定します。
FileFormat 省略可能 ファイル形式を指定します。定数は、XlFileFormat 列挙体から選択します。
Password 省略可能 読み取り時のパスワードを指定します。
WriteResPassword 省略可能 書き込み時のパスワードを指定します。
Filename引数について

完全パスを含めることもできます。

完全パスを含めない場合は、ファイルは現在のフォルダーに保存されます。

FileFormat引数について

XlFileFormat列挙体の定数を指定します。ExcelCSXでは、通常、定数をそのまま記載できないため、列挙体(enum)の値を指定してください。

なお、この列挙体は値が多いため、下表には代表的な値のみ示しています。詳しくは、MSDNを参照してください。

引数に指定する定数 enum値 概要
xlWorkbookDefault 51 規定のブック形式
xlWorkbookNormal -4143 ブックの標準形式
xlCSV 6 CSV形式
xlExcel9795 43 Excel95, 97のブック形式
xlHtml 44 HTML形式

なお、既存のファイルでは、指定された最後のファイル形式が既定のファイル形式となります。

また、新しいファイルでは、現在使用されている Excel のバージョンでのファイル形式が既定のファイル形式となります。

Password引数について

ファイルを保護するためのパスワードを表す 15 文字以内の文字列を指定します。大文字と小文字が区別されます。

WriteResPassword引数について

パスワードを設定して保存されたファイルを、パスワードを指定しないで開くと、ファイルは読み取り専用で開かれます。

サンプルコード

//アクティブなワークブックをtest.csvの名前で、CSV形式で保存します。
Excel.ActiveWorkbook.SaveAs(Filename:"test.csv",FileFormat:6);

ワークブックを閉じる

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

ワークブックを閉じる

ワークブックを閉じるには、WorkbookオブジェクトのCloseメソッドを使用します。このメソッドは引数で、閉じる際に、ブックを保存して閉じるか否かを設定できます。

Closeメソッドの構文

(Workbookオブジェクト).Close(SaveChanges, Filename, RouteWorkbook)

Closeメソッドの引数

引数名 必須 / オプション 内容
SaveChanges 省略可能 ブックに変更がある場合に、変更を保存するかどうかを指定します。
Filename 省略可能 変更後のブックのファイル名を指定します。
RouteWorkbook 省略可能 次の回覧対象のユーザに、ブックを送信するか否かを指定します。
SaveChanges引数について

ブックに変更があり、開いている他のどのウィンドウにも表示されていない場合、この引数で、変更を保存するかどうかを指定します。

(ブックに変更がない場合、この引数は無視されます。ブックに変更があり、開いている他のウィンドウに表示されている場合、この引数は無視されます。)

true を指定すると、変更がブックに保存されます。

ブックにファイル名が付けられていない場合は、FileName がファイル名として使用されます。Filename を省略すると、ファイル名を指定するダイアログ ボックスがユーザーに表示されます。

RouteWorkbook引数について

この引数は、ブックを次の受信者に回覧する必要がある場合(回覧用紙があり、未回覧の人がいる場合)にのみ有効となります。

trueを指定すると、次の受信者にブックが送信されます。

falseを指定すると、ブックは送信されません。

引数を省略するとブックを送信するかどうか確認するダイアログボックスがユーザーに表示されます。

注意

このメソッドでブックを閉じるとき、ブックの Auto_Close マクロは実行されません。Auto_Close マクロを実行するには、RunAutoMacros メソッドを使用します。

サンプルコード

//アクティブなワークブックを閉じます。変更は保存しません。
Excel.ActiveWorkbook.Close(SaveChanges:false);