範囲指定したCellのデータを取得


 Excelのセルにあるデータを一つ一つ読み込んでいたのでは非常に時間が掛かります。
そこで、セルを範囲指定して一括でメモリに取り込んで処理する方法があります。
クリップボードを使用する方法と、COleSafeArrayクラスを使用する方法です。
前者は、面白味がないので、後者の方法を紹介します。

  セルを範囲指定して、COleVariant型へ格納すると、COleVariantのparrayにデータが
格納されます。これは、SAFEARRAY型の配列を意味しています。この配列を操作するための
クラスがCOleSafeArrayクラスです。


ここでは、#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_getarrayDlg::OnButton1() 
{
    COleVariant data;
    VARIANT val;
    long index[2];
    long lNumRows;
    long lNumCols;
    int r, c;
    COleSafeArray sa;

    using namespace Excel;
    _ApplicationPtr pXL;

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

    //WorkBookを追加する
    WorkbooksPtr pBooks = pXL->Workbooks;
    _WorkbookPtr pBook  = pBooks->Open("C:\\temp\\Book1.xls");

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

    //Cell範囲を取得
    RangePtr pCells = pSheet->Range["A1"]["D10"];
    data = pSheet->Range["A1"]["D10"]->Value2;    

    //SafeArrayクラスに取得したSAFEARRAY型のデータを結びつける
    sa.Attach(data);

    //データ領域の範囲を取得
    sa.GetUBound(1, &lNumRows);
    sa.GetUBound(2, &lNumCols);

    //データを取得
    for(r = 1; r <= lNumRows; r++){
        index[0]=r;
        for(c = 1; c <= lNumCols; c++){
            index[1]=c;
            sa.GetElement(index, &val);

            switch(val.vt)
            {
            case VT_R8:
               {
                  TRACE("%1.2f", val.dblVal);
                  break;
               }
            case VT_BSTR:
               {
                  TRACE("%s",(CString)val.bstrVal);
                  break;
               }

            case VT_EMPTY:
               {
                  TRACE("");
                  break;
               }
            }
            TRACE("\n");
        }
    }

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