Excelの書式一括変更処理


すだこ  2007-12-21 17:18:05  No: 67231  IP: [192.*.*.*]

物理的に出来る事なのか無理な事なのかわからないので質問します。
COMによるExcel操作で、COleSafeArrayを使って文字列を一気に設定する
処理があると思いますが。

    COleSafeArray sa;
    DWORD numElements[] = {0, 0};
    numElements[0] = lMaxRow;
    numElements[1] = lMaxCol;
    CString strBuf;

    //データを格納
    for(long lCol=0L; lCol < lMaxCol; lCol++){
        for(long lRow=0L; lRow < lMaxRow; lRow++){
            numElements[0] = lRow;
            numElements[1] = lCol;
            strBuf.Format("%d-%d", lRow, lCol);
            sa.PutElement((long*)numElements, strBuf.AllocSysString());
        }
    }
    sheet->Range[pSel][vtMissing]->Value = sa;

これと同じ感じで、セルの書式設定もできないでしょうか?
↓こういった感じで
    for(long lCol=0L; lCol < lMaxCol; lCol++){
        for(long lRow=0L; lRow < lMaxRow; lRow++){
            numElements[0] = lRow;
            numElements[1] = lCol;
            long color = (long)RGB(255,0,0);
            sa.PutElement((long*)numElements, &lWrk);
        }
    }
    sheet->Range[pSel][vtMissing]->Font->Color=sa;

実際に自分でやってみたのですが、色は変わってくれませんでした。
しかし、アプリケーションエラーにもならないので、出来る方法があるのかな
と思い質問しました。
これが出来ると色々と楽だったのですが、出来なかったら諦めて
セルの範囲指定(A1:B10のような)で設定しようと思っています。
よろしくお願いします。

編集 削除
Blue  2007-12-21 17:42:41  No: 67232  IP: [192.*.*.*]

フォントの色なら範囲指定でできるのでは?
VBAなら

Range("A1:B3").Font.Color = RGB(255, 0, 0)

てな感じでできるので、同じように
SheetオブジェクトのGetRangeメソッドみたいので、範囲のRangeオブジェクトを取得できないですか?


※VC++のバージョンがわからないのでこれ以上アドバイスができません。

編集 削除
すだこ  2007-12-25 19:49:57  No: 67233  IP: [192.*.*.*]

Blueさん、回答ありがとうございます。
VS2005にて開発しています。(MFCも使っています)
ExcelはExcel2000です。

フォントカラーを例に記述しましたが、実際にはフォントサイズや太字等の文字スタイル
水平・垂直方向への文字位置などの設定も行います。
この時、1セル単位に設定するとかなり時間が掛かってしまいます。
sheet->Range["A1"][vtMissing]->Font->Color = RGB(255,0,0);
sheet->Range["B1"][vtMissing]->Font->Color = RGB(255,0,0);
sheet->Range["C1"][vtMissing]->Font->Color = RGB(255,0,0);
etc..

上記例なら、A1:C1と設定すれば1回で設定できますが設定する内容がバラバラの場合は
結局セル毎に設定しなければならず時間が掛かってしまいます。
この問題は、文字を設定する際にもぶつかった問題だったのですが文字に関しては
COleSafeArrayを使うことによって、瞬時に設定する事ができるようになりました。

同じように2次元配列の中に各セルの設定を入れておき、それを指定したセルの
設定項目に渡せば、文字列と同じ感じで書式設定も一度に設定できるのではないかと考えました。

    COleSafeArray sa;
    DWORD numElements[] = {0, 0};    // 行数・列数
    numElements[0] = lMaxRow;   // 行数
    numElements[1] = lMaxCol;   // 列数
    sa.Create(VT_R4, 2, numElements);  // <-- CreateするときのVT_R4の値が怪しい
    for(long lCol=0L; lCol < lMaxCol; lCol++){
        for(long lRow=0L; lRow < lMaxRow; lRow++){
            numElements[0] = lRow;
            numElements[1] = lCol;
            long color = (long)RGB(255,0,0);
            sa.PutElement((long*)numElements, &color);
        }
    }
    sheet->Range["A1:H10"][vtMissing]->Font->Color=sa;

しかし、やはり設定は反映されません。
COleSafeArrayをFont->Colorなどに渡す事がそもそも無理な話だとは思っていたのですが
先に書いたように、コンパイルエラーにもアプリケーションエラーにもならないので
設定ミスなのかな〜と思って質問した次第です。

この方法で、書式設定ができれば劇的に速くなるはずなので、まだ諦めきれずに頑張ってます(汗
何か情報がありましたら、よろしくお願いします。

編集 削除