ほとんど連続質問になってしまい恐縮なのですがお願いします。
開発環境は vc++6.0 EXCEL2000 windows2000 MFCのダイアログベースで作成していま
す。
以下のようなコードを書いているのですが(主要な宣言のみです)
_WorksheetPtr pSheet = pXL->ActiveSheet; //アクティブシートの取得
CString pp=A1; //セル番地
RangePtr pCells;
RangePtr pColor;
pCells = pSheet->Range[(_variant_t)pp]; //ppのセル番地を取得
pColor = pCells->Interlor->ColorIndex; //ppのセル番地の色情報を獲得
これ以降の処理で、pColorの色がこちらで指定した色ならば「A」違っていれば「B」と
いう処理を行いたいのですが、
以下のような条件式
if(pColor == [??]){
「A」
}else{
「B」
}
で行えるとは思うのですが、??に入れるべき色の情報として
例えば「青」とした場合、どのような値を入れればよいのかが分かりません。
伝わりにくい部分もあるかと思いますが、よろしくお願いします。
すみません。下の宣言を書くのを忘れていました。
_ApplicationPtr pXL;
Excelのデフォルトの設定のままであれば、
http://www.relief.jp/itnote/archives/000482.php
をみると、青は5であることがわかります。
>pCells->Interlor->ColorIndex;
の戻り値は RangePtr でしょうか?
_variant_tもしくはlong型ではないでしょうか?
Excel::InteriorPtr pInterior = pCells->GetInterior();
_variant_t vColor = pInterior->GetColorIndex();
if (vColor.intVal == 5)
{
// 青です。
}
ちなみにColorプロパティからも比較できますが、
内部の値がdouble型になってしまっているので単にキャストして比較できないので
少し工夫します。
_variant_t vColor = pInterior->GetColor(); // vColor は VT_R8 -> double型の値
// とりあえず long 型(VT_I4)で値を入れておく
_varinat_t vBlue((long)RGB(0x00, 0x00, 0xff));
// vColorの型に変換する
vBlue.ChangeType(vColor.vt);
// これで普通に比較できる
if (vColor == vBlue)
{
// 青です。
}
取得した vColor のほうを long型に変換して比較するのもありかも。
_variant_t vColor = pInterior->GetColor();
// long型に変換する
vColor.ChangeType(VT_I4);
// long型の値で比較
if (vColor.lVal == (long)RGB(0x00, 0x00, 0xff))
{
// 青です。
}
いろいろやっていたら、_variant_t型の(operator)キャストは内部でChangeType
を呼んで変換しているようです。
ということで、Colorで取得した値を比較するときは
_variant_t vColor = pInterior->GetColor();
if ((long)vColor == RGB(0x00, 0x00, 0xff))
{
// 青です。
}
というのが一番スマートですね。
返信が遅くなって申し訳ございません。
おかげで目的の動きをするプログラムを組むことができました。
ソースもさることながら、カラーインデックスのプロパティ値一覧表が
最高に役に立ちました。本当にありがとうございました。