読者です 読者をやめる 読者になる 読者になる

黙々とC#

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


セルの指定とプロパティセット

Excel C# Script入門講座

本記事は、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!"という文字列がセットされます。

f:id:d_ymkw:20160713161129p:plain

ここでアクティブなシートとは、現在画面上に表示されているシートを指します。

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"; 

f:id:d_ymkw:20160713163457p:plain

セルのプロパティ

セル(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;

f:id:d_ymkw:20160713164227p:plain

また、上記単一のセルを操作する例では、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プロパティを使用した場合は、対象のセル範囲全体の高さ、幅を取得できます。