本記事は、Excel C# Script入門講座の1記事です。
セルの指定
スクリプトが操作対象とするセルを指定する方法には、Rangeプロパティを使用する方法とCellsプロパティを使用する方法とがあります。
RangeプロパティとCellsプロパティはいずれも指定したセル(Range オブジェクト)を返します。Rangeプロパティを使用する方法では、"A1"、"B2"など表記方法(『A1形式』)でセルを指定し、 Cellsプロパティを使用する方法では、行番号と列番号によりセルを指定します。
以下の例では、Rangeプロパティを使用しValueプロパティに値をセットしています。
var activeSheet = Excel.ActiveWorkbook.ActiveSheet; activeSheet.Range("A1").Value = "Hello, Excel CSX!"; //アクティブなシートへのアクセスであれば下記表記も可能 Excel.Range("A1").Value = "Hello, Excel CSX!";
以下の例では、Cellsプロパティを使用しValueプロパティに値をセットしています。
var activeSheet = Excel.ActiveWorkbook.ActiveSheet; //行、列の順に指定 activeSheet.Cells[1, 1].Value = "Hello, Excel CSX!"; //列をアルファベット名で指定することも可能 activeSheet.Cells[1, "A"].Value = "Hello, Excel CSX!";
上記の例では、いずれもアクティブなシートのセル"A1"に"Hello, Excel CSX!"という文字列がセットされます。
ここでアクティブなシートとは、現在画面上に表示されているシートを指します。
VBAとの相違点
Excel VBAでは、コードをいきなりRangeプロパティやCellsプロパティから書き始めても、対象のエクセルオブジェクトやブック、シートは暗黙的に指定され実行することが可能です。しかしながら、ExcelCSX(C# Script)では、Excel VBAと異なり、操作対象のエクセルオブジェクト・ブック・シートなどは省略することはできません。
ExcelCSXでは、現在ExcelCSXを実行中のExcelのApplicationオブジェクト(トップレベルのオブジェクト)を、"Excel"という名前の変数として取り出すことができます。スクリプト作成にあたっては、"Excel"を起点として、目的とするブックやシートを取得してください。
RangeプロパティとCellsプロパティの相違点
RangeプロパティとCellsプロパティ、どちらも同じ働きをするプロパティですが、
Cellsプロパティは、Worksheetオブジェクトのプロパティであるのに対し、
Rangeプロパティは、Worksheetオブジェクトのプロパティとして存在するのに加え、トップレベルのApplicationオブジェクト(ExcelCSXにおけるExcel変数)のプロパティとしても存在しています。
ワークシートの指定
アクティブでないシートのセルに同じようにデータをセットするには、目的のシートをApplicationオブジェクトのワークシートプロパティにより指定します。
var targetSheet = Excel.Worksheets("Sheet2"); //Sheet2の部分は、アクティブにしたいシート名を指定して下さい
その後、『セルの指定』での説明同様に、目的のシートオブジェクトのRangeプロパティまたはCellsプロパティで セルを指定してデータをセットします。 以下の例では、Worksheetプロパティにより"Sheet2"を指定してセルA1にデータをセットしています。
var targetSheet = Excel.Worksheets("Sheet2"); targetSheet.Range("A1").Value = "Hello, C# Script.";
なお、上記コードではSheet2に対して複数の操作を行う場合を想定して、Sheet2のワークシートオブジェクトをtargetSheet変数として取得していますが、単にSheet2のA1セルに文字列を代入したいだけであれば、以下のようにも書けます。
Excel.Worksheets("Sheet2").Range("A1").Value = "Hello, C# Script.";
アクティブシートの切り替え
なお、ワークシートを指定する別の方法としては、アクティブなシートをスクリプトから変更する方法があります。
目的のシートをアクティブな状態にするには、目的のワークシートオブジェクトのActivateメソッドを呼び出すことで実現できます。
Excel.Worksheets("Sheet3").Activate();
アクティブなシートが切り替わった後は、上記『セルの指定』で用いたアクティブシートに対するスクリプトがそのまま使うことが可能です。
以下では、Sheet3をアクティブシートに切り替えた後、Sheet3のA1セルに"Nonsense"という文字列をセットしています。
Excel.Worksheets("Sheet3").Activate(); var activeSheet = Excel.ActiveWorkbook.ActiveSheet; activeSheet.Cells[1, 1].Value = "Nonsense";
セルのプロパティ
セル(Rangeオブジェクト)には、Valueプロパティの他にもさまざまなプロパティが用意されています。 以下の例では、Sheet2のA1セルに文字列をセット後、RowHeightプロパティに値を代入することで「セルの高さ」を、 ColumnWidthプロパティに値をセットすることにより「セルの幅」を変えています。
var sheet = Excel.Worksheets("Sheet2"); sheet.Range("A1").Value="ExcelCSX"; sheet.Range("A1").RowHeight=20; sheet.Range("A1").ColumnWidth=100;
なお、上記コードではA1セル(Rangeオブジェクト)に対して複数回の操作を行っているため、変数に代入することでコードを短くすることができます。
var a1 = Excel.Worksheets("Sheet2").Range("A1"); a1.Value="ExcelCSX"; a1.RowHeight=20; a1.ColumnWidth=100;
また、上記単一のセルを操作する例では、RowHeightプロパティに代えてHeightプロパティを、 ColumnWidthプロパティに代えてWidthプロパティを使っても同一の結果を得ることができます。
var a1 = Excel.Worksheets("Sheet2").Range("A1"); a1.Value="ExcelCSX"; a1.Height=20; a1.Width=100;
RowHeightとHeight、ColumnWidthとWidthの相違点
これらのプロパティは単一セル(を指定したRangeオブジェクト)に対して呼び出す分にはどちらも同じ結果となりますが、複数のセル範囲を指定したRangeオブジェクトに対して呼び出した際に結果が変わってきます。
RowHeightプロパティを使用した場合には、指定した範囲内の先頭の行の高さを、ColumnWidthプロパティを使用した場合には、指定した範囲内の先頭の幅の高さを取得できます。
一方、Heightプロパティ、Widthプロパティを使用した場合は、対象のセル範囲全体の高さ、幅を取得できます。