プログラムからのエクセル操作は、実際にエクセルを使うとき同様WorksheetオブジェクトおよびCellに対して行います。したがってExcel Application->Workbooks->Workbook->Worksheets->Worksheet->Range->Cellの順にオブジェクトをアタッチしていくことでCellを操作することができます。オブジェクトとクラスの関連は最初に記したとおりですので次のような宣言になります。また、covTrue,covFalse,conOptionalは以降の関数で使用するパラメータ定義です。
CWorkbooks wbooks;
CWorkbook wbook;
CWorksheets wsheets;
CWorksheet wsheet;
COleVariant covTrue((short)TRUE),
covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
前項まででApplicationオブジェクトは取得できていますのでまずWorkbooksオブジェクトを取得します。最初のput_UserControl()はExcelアプリケーションがユーザによる操作を禁止します。(デバッグ時は、表示できるようにすると結果をその場で確認できるので便利です。)
#ifdef __DEBUG
excel.put_Visible(TRUE);
excel.put_UserControl(TRUE);
#else
excel.put_Visible(FALSE);
excel.put_UserControl(FALSE);
#endif
//workbooksオブジェクトにアタッチ
wbooks.AttachDispatch(excel.get_Workbooks());
Workbooksオブジェクト以下、Worksheetsオブジェクトまで順番にオブジェクトへアタッチします。当コンテンツではアプリケーションのデータをExcelに保存するというサンプルですのでWorkbookオブジェクトにアタッチする際にはWorkbooksオブジェクトに新規でWorkbookオブジェクトを追加しています。
wbooks.AttachDispatch(excel.get_Workbooks());
//workbooksに新規Workbookを作成しwookbookオブジェクトにアタッチ
wbook.AttachDispatch(wbooks.Add(covOptional));
//作成したworkbookのworksheetsオブジェクトにアタッチ
wsheets.AttachDispatch(wbook.get_Worksheets());
worksheetsオブジェクトは通常3枚のシートを内包しています。実作業はこのうちのどれかのシートに対しておこないますのでまず特定のシートにアタッチする必要があります。
//先頭のシートにアタッチ
wsheet.AttachDispatch(wsheets.get_Item(COleVariant((short)1)));
wsheet.put_Name("サンプルシート");
新規にシートを追加する場合は下記のようになります。この例では、現在のシート数(wsheets.get_Count())から最後のシートオブジェクトを取得し、そのシートの後ろに新しいシートを追加します。
//最後のシートの後ろに新規シートを追加してアタッチ
VARIANT varLast;
varLast.vt = VT_DISPATCH;
varLast.pdispVal = wsheets.get_Item(
COleVariant((long)wsheets.get_Count())
);
wsheet.AttachDispatch(
wsheets.Add(covOptional,varLast,COleVariant((long)1),covOptional)
);
wsheet.put_Name("サンプルシート");
Worksheetオブジェクトへのアタッチができれば、いよいよセルの操作になります。