VC++(MFC)でExcelを操作する方法(2)

前回は、セルに値を設定するところまで書いたので書式設定方法について補足します。前回書いた方法で値をセットしたエクセルを開いてみるとわかるのですが数値としてセルにセットした内容も文字列として表示されています。一度、セルを選択してダブルクリックするなどすれば数値として認識されるようですがこれは少し面白くありません。最初は、単にセルに書式を設定すればちゃんと数値扱いになるかななどとタカを括っていたのですが...

セルに書式を設定するには該当するセルのRangeオブジェクトに対し、put_NumberFormat()で書式を与えます。具体的な書式はエクセルのヘルプを参照してみてください。以下の例では、A1のセルに"#,##0"の書式と数値の1000をセットしています。

CRange cell;
cell.AttachDispatch(wsheet.get_Range(COleVariant("A1"),COleVariant("A1")));
cell.put_NumberFormat(COleVariant("#,##0"));
cell.put_Value(COleVariant((short)1000));

これでエクセルを開いてみたとき、1,000と表示されることを期待したのですが残念ながら1000のままです。そこで、このセルに対してエクセル操作でいうところの[形式を選択して貼り付け]-[形式:すべて]+[演算:乗算]を実行します。(この裏技はマイクロソフトのWebサイトに載っていたた記憶があるのですがなにしろ遠い昔の記憶なのでちょっと原典を探すことができませんでした。)

まず、ダミーとなるセルに書式と値(通常は1でいいと思います)を設定します。ダミーのセルはあとで元に戻せばどこでもいいです。

VARIANT vn;
vn.vt = VT_ERROR;
vn.scode = DISP_E_PARAMNOTFOUND;
COleVariant varnull = vn;
CRange dummy_cell;
CRange cell;
dummy_cell.AttachDispatch(wsheet.get_Range(COleVariant("X1"),COleVariant("X1")));
dummy_cell.put_NumberFormat(COleVariant("#,##0"));
dummy_cell.put_Value(COleVariant((short)1));
//ダミーセルをコピー
dummy_cell.Copy(varnull);
//値をセット
cell.AttachDispatch(wsheet.get_Range(COleVariant("A1"),COleVariant("A1")));
cell.put_NumberFormat(COleVariant("#,##0"));
cell.put_Value(COleVariant((short)1000));
//形式を選択して貼り付け
cell.PasteSpecial(-4104,4,varnull,varnull);
//ダミーをクリア
dummy_cell.put_Value((COleVariant(""));

その他は、put_xxxxx()系のメソッドをみていけばいいでしょう。例えば、センタリングは、

put_HorizontalAlignment(COleVariant((short)-4108));

だし、数式の設定は

cell.AttachDispatch(wsheet.get_Range(COleVariant("A10"),COleVariant("A10")));
cell.put_Formula(COleVariant("=sum(A1:A9)"));

のようになります。このあたりはエクセルVBAとほぼ名前が同じになりますのでエクセルのヘルプを参照するとよいと思います。また、パラメータの数値についてもxlXXXXXの定数値です。本来、タイプライブラリから生成されたヘッダに定義されていれば楽なのですがそうはなっていないようです。

この記事のトラックバックURL:

http://hippos-lab.com/blog/trackback/104

返信