範囲指定したCellへ配列データを出力


 Excelのセルに大量のデータを一つ一つ書き込んでいたのでは非常に時間が掛かります。
そこで、Excelへの出力用の配列を指定セル範囲へ一括で書き込む方法を示します。

COleSafeArrayクラスを使用して、SAFEARRAY型の配列を使用します。


ここでは、#importを使用してタイプライブラリを取り込んだ場合のサンプルを示します。

【サンプル】

//Excelを操作するためのタイプライブラリを読みこむ(Excel2002用)
#import "C:\Program Files\Common Files\Microsoft Shared\Office10\MSO.DLL" no_namespace rename("DocumentProperties", "DocumentPropertiesXL")   
#import "C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\Vbe6ext.olb" no_namespace   
#import "C:\Program Files\Microsoft Office\Office10\EXCEL.EXE" rename("DialogBox", "DialogBoxXL") rename("RGB", "RBGXL") rename("DocumentProperties", "DocumentPropertiesXL") no_dual_interfaces

void CXls_imp_setarrayDlg::OnButton1() 
{
    double val;
    long index[2];
    COleSafeArray sa;

    using namespace Excel;
    _ApplicationPtr pXL;

     //Excelの起動
    pXL.CreateInstance(L"Excel.Application");
    pXL->Visible = TRUE;

    //WorkBookを追加する
    WorkbooksPtr pBooks = pXL->Workbooks;
    _WorkbookPtr pBook  = pBooks->Add(vtMissing);

    //アクティブ・シートを取得
    _WorksheetPtr pSheet = pXL->ActiveSheet;

    //COleSafeArrayに出力用のデータを格納
    DWORD numElements[] = {10, 10};    //10 x 10の配列
    sa.Create(VT_R8, 2, numElements);


    //データを格納
    for(index[0] = 0; index[0] < 10; index[0]++){
        for(index[1] = 0; index[1] < 10; index[1]++){

        val = index[0] + index[1];

        //SafeArrayにデータを格納
        sa.PutElement(index, &val);
        }
    }

    //配列をExcelへ出力
    pSheet->Range["A1"]["J10"]->Value2 = sa;
    sa.Clear();

    //Excelを閉じる
    pXL->Quit();
    
}