Excel-DNAでExcelのワークシートやセルをいろいろと操作しようと考えたところ悩んだたため、今後のためにまとめておきます。
環境
- Windows7 SP1
- .NET Framework 4 (ExcelDnaUtil.Applicationをdynamicで受ける必要があるため)
- Visual Studio 2012
- Excel-DNA 0.30
なお、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 メモ帳
他に、以下も参考になりました。
- Google グループ (現在のシート名を取得する)
- Google グループ (現在のシート名を変更する)
- excel dna - How do I use ExcelDNA to select a cell? - Stack Overflow (セルを選択する)
R1C1形式については、こちら。
セルに数式を入力/取得する(Formula/FormulaR1C1プロパティ):Excel VBA|即効テクニック|Excel VBAを学ぶならmoug
ソースコード
以下のGistに置いておきました。
Excel-DNAでExcelのワークシートを操作するサンプル · GitHub