指定したセルの色を判定して処理を行いたい

[戻る]
ポンチョ 2007/02/15(木) 23:04:17
ほとんど連続質問になってしまい恐縮なのですがお願いします。

開発環境は 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」
}

で行えるとは思うのですが、??に入れるべき色の情報として
例えば「青」とした場合、どのような値を入れればよいのかが分かりません。
伝わりにくい部分もあるかと思いますが、よろしくお願いします。

ポンチョ 2007/02/15(木) 23:06:21
すみません。下の宣言を書くのを忘れていました。

_ApplicationPtr pXL;

Blue 2007/02/16(金) 00:23:16
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)
{
    // 青です。
}

Blue 2007/02/16(金) 00:43:44
ちなみに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)
{
    // 青です。
}

Blue 2007/02/16(金) 01:23:50
取得した vColor のほうを long型に変換して比較するのもありかも。

_variant_t vColor = pInterior->GetColor();
// long型に変換する
vColor.ChangeType(VT_I4);
// long型の値で比較
if (vColor.lVal == (long)RGB(0x00, 0x00, 0xff))
{
    // 青です。
}

Blue 2007/02/16(金) 01:30:07
いろいろやっていたら、_variant_t型の(operator)キャストは内部でChangeType
を呼んで変換しているようです。

ということで、Colorで取得した値を比較するときは

_variant_t vColor = pInterior->GetColor();
if ((long)vColor == RGB(0x00, 0x00, 0xff))
{
    // 青です。
}

というのが一番スマートですね。

ポンチョ 2007/02/17(土) 19:49:09
[[解決]]
返信が遅くなって申し訳ございません。
おかげで目的の動きをするプログラムを組むことができました。
ソースもさることながら、カラーインデックスのプロパティ値一覧表が
最高に役に立ちました。本当にありがとうございました。

古いスレッドには追加発言できません。