セルに数式を設定する

put_Formula

セルに数式を設定する場合も基本は同じです。セルを選択し数式をput_Formula()メソッドで設定します。下記のコードはA列の合計を算出します。

cell.AttachDispatch(
  wsheet.get_Range(COleVariant("A3"),COleVariant("A3"))
);
cell.put_NumberFormat(COleVariant("#,##0"));
cell.put_Formula(COleVariant("=sum(A1:A2)"));

PasteSpecialの利用

B3以下E列までの合計金額計算式もセットします。この時、1つずつセットするよりも数式をコピーするほうがパフォーマンスが良いです。PasteSpecial()メソッドはExcelの[形式を選択して貼り付け]-[式]に相当します。

COleVariant varnull(DISP_E_PARAMNOTFOUND,VT_ERROR);
cell.Copy(varnull);
dummy_cell.AttachDispatch(
  wsheet.get_Range(COleVariant("B3"),COleVariant("E3"))
);
dummy_cell.PasteSpecial(-4123,-4142,varnull,varnull);
dummy_cell.put_NumberFormat(COleVariant("\\#,##0"));

PasteSpecial()メソッドはPasteSpecial(XlPasteType,XlPasteSpecialOperation,boolean,boolean)ですが、このときの引数は、

を指定しています。詳細についてはVBAのドキュメント等を参照してください。残念ながら、タイプライブラリから生成されるMFCのラッパクラスにはこれらの定数は定義されていません。

また、元セル(A3)をコピーする際の引数にはNULLを指定しています。VBAでのコピーメソッドは省略可能ですがMFCクラスでは省略できませんのでCOleVariantのNULLを引数として指定する必要があります。

また、上記例ではいったんコピーした後PastSpecial()で貼り付けていますが、Copyメソッドに貼り付け先のセルを指定してダイレクトにコピーする方法もあります。その場合数式だけをコピーするというオプションがありませんから書式設定まで含めすべてがコピーされます。セルに罫線を設定している場合などは注意が必要です。