Excel-DNA + C# での、Excelワークシートやセル操作のまとめ

Excel-DNAでExcelのワークシートやセルをいろいろと操作しようと考えたところ悩んだたため、今後のためにまとめておきます。

環境


なお、ExcelDnaUtil.Applicationを使うことでCOMを使ってVBAライクに操作ができるようですが、IntelliSenseによるコード補完やパフォーマンスのことを考えて、なるべく使わないようにしています。

ワークシートの操作

ワークシートの新規作成

新規作成したワークシートがアクティブになります。

XlCall.Excel(XlCall.xlcWorkbookInsert);
ワークシートの削除

アクティブになっているワークシートを削除します。

XlCall.Excel(XlCall.xlcWorkbookDelete);
ワークシートの移動

「XlCall.xlcWorkbookMove」を使い、第一引数にシート名を、第二引数にブック名を、第三引数に左からの位置(一番左が1)をそれぞれ指定します。
ブック名を指定しない場合、新しいブックを作成し、そちらにワークシートを移動します。


なお、以下の例ではワークシート数はCOM経由で行っています。COMを使わない方法が分からなかったためです。

//  COM経由でワークシート数を取得
dynamic app = ExcelDnaUtil.Application;
var count = app.Worksheets.Count;


MessageBox.Show("Sheet2を一番右へ移動します");
XlCall.Excel(XlCall.xlcWorkbookMove, "Sheet2", "test.xlsx", count);


MessageBox.Show("Sheet2を一番左へ移動します");
XlCall.Excel(XlCall.xlcWorkbookMove, "Sheet2", "test.xlsx", 1);
ワークシートをコピーして移動

現在の枚数 +1 の位置へ移動するため、第三引数も +1 しておきます。

dynamic app = ExcelDnaUtil.Application;
var count = app.Worksheets.Count;

//  一番右に新規作成するので、現在の枚数に +1 しておく
MessageBox.Show("Sheet2を、ブック内の一番右にコピーして移動します");
XlCall.Excel(XlCall.xlcWorkbookCopy, "Sheet2", "test.xlsx", count + 1);
ワークシートのアクティブ化
XlCall.Excel(XlCall.xlcWorkbookActivate, "Sheet2");
ワークシートの全選択
XlCall.Excel(XlCall.xlcSelectAll);
ワークシートの名前変更

以下の例では、Sheet1をhogeに変更しています。
なお、ワークシートはアクティブになりません。

XlCall.Excel(XlCall.xlcWorkbookName, "Sheet1", "hoge");
ワークシートの非表示
XlCall.Excel(XlCall.xlcWorkbookHide, "Sheet2");
ワークシートの再表示
XlCall.Excel(XlCall.xlcWorkbookUnhide, "Sheet2");
アクティブなブックの名前取得 (2013/12/06追加)
XlCall.Excel(XlCall.xlfGetWorkbook, 16).ToString();
アクティブなシートの名前取得 (2013/12/06追加)
XlCall.Excel(XlCall.xlfGetWorkbook, 38, "test.xlsx").ToString();

セルの操作

アクティブなワークシートのセルの値を取得する
var cell = new ExcelReference(0, 0).GetValue();
アクティブなワークシートのセルに、値を設定する

A1の位置が「0, 0」です。

var cell = new ExcelReference(0, 0).SetValue("fuga");
アクティブなワークシートで、セルの範囲を選択する

セルを選択する書式は、R1C1形式で記述する必要があります。
第一引数はセルの範囲を、第二引数は第一引数の範囲でアクティブにするセルを、それぞれ指定します。


以下は、現在のアクティブセルがA1の時に、

  • A1:E5の範囲を選択
  • アクティブセルをB3にする

時の例です。

// 絶対参照
XlCall.Excel(XlCall.xlcSelect, "R1C1:R5C5", "R3C2");

// 相対参照
XlCall.Excel(XlCall.xlcSelect, "R[0]C[0]:R[4]C[4]", "R[2]C[1]");
アクティブなワークシートで、セルやセル範囲の値をクリアする
XlCall.Excel(XlCall.xlcClear);
アクティブなセル(範囲)の罫線を設定する (2013/12/06追加)

罫線を作成・削除、罫線の色を設定などを行います。
「(int)outline」などとなっている引数は、実際には数字をセットしますが、その数字は以下の「Excel 4 Macro Reference」に記載されています(たくさんあるのでここでは省略)。

XlCall.Excel(XlCall.xlcBorder, (int)outline, (int)left, (int)right, (int)top, (int)bottom, (int)shade,
                               (int)outlineColor, (int)leftColor, (int)rightColor, (int)topColor, (int)bottomColor);
指定したセルの幅を、文字にジャストフィットさせる (2013/12/06追加)
XlCall.Excel(XlCall.xlcColumnWidth, 0, "R1C1形式でのセル範囲", 0, 3);

参考資料

xlcで始まる Excel 4.0 macro commandsの一覧は公式ページからリンクされている、「Excel 4 Macro Reference」のpdfファイルを参考にしました。
CodePlex Archive


また、以下の資料で書き方の雰囲気を参考にしました。
CXlMacros Methods


日本語の記事では、以下の記事や、同じブログ内での「Excel-DNA」タグが参考になりました。
Workbookを選択する - regerege メモ帳


他に、以下も参考になりました。


R1C1形式については、こちら。
セルに数式を入力/取得する(Formula/FormulaR1C1プロパティ):Excel VBA|即効テクニック|Excel VBAを学ぶならmoug