(a1:c3)から次の範囲があると仮定しましょう
A B C
1 -1 1 1
2 -1 0 0
3 0 0 1
これで、次の範囲を選択し、条件付き書式を使用して書式設定しました(デフォルトの赤黄緑のカラースケールを使用)...範囲の色が
A B C
1 Green Red Red
2 Green Yellow Yellow
3 Yellow Yellow Red
ここで、範囲内のセルの色、たとえばMsgBox Range( "A1")。Interior.Colorを尋ねたいのですが、それが緑であるとは言われていません。なぜですか? Plzは私を助けることができますか?
Range( "A1")。Interior.Colorは常に16777215を返しますRange( "A1")。Interior.ColorIndexは常に-4142を返します
(A1の色が赤、青、緑などであるかどうかに関係なく)
Range( "A1"、 "C3")。FormatConditions.Countこれは常に0を返しますが、なぜですか?
一度に3つ以上の異なる色を使用する可能性があるため、条件付き書式のデフォルトの色でこれを処理する適切な方法が見つかりませんでした...この方法で実行しました。次に、セルの色を尋ねるたびに、正しい色を取得します。
for (int t = 0; t < d_distinct.Length; t++ )
{
Excel.FormatCondition cond =
(Excel.FormatCondition)range.FormatConditions.Add(
Excel.XlFormatConditionType.xlCellValue,
Excel.XlFormatConditionOperator.xlEqual,
"="+d_distinct[t],
mis, mis, mis, mis, mis);
cond.Interior.PatternColorIndex =
Excel.Constants.xlAutomatic;
cond.Interior.TintAndShade = 0;
cond.Interior.Color = ColorTranslator.ToWin32(c[t]);
cond.StopIfTrue = false;
}
d_distinctは、範囲内のすべての個別の値を保持します... cは、すべての個別の値に対して個別の色を保持するColor []です。このコードは簡単にvbに変換できます!
.Interior.Colorは、条件付きでフォーマットされた色の結果ではなく、「実際の」色を返します。
@sss:API経由では利用できません。
最善の方法は、条件付き書式で使用したのと同じ条件をテストすることです。
これによりコードが重複するのを防ぐために、条件付き基準をUDFに移動することをお勧めします。例:
Function IsGroup1(ByVal testvalue As Variant) As Boolean
IsGroup1 = (testvalue < 0)
End Function
Function IsGroup2(ByVal testvalue As Variant) As Boolean
IsGroup1 = (testvalue = 0)
End Function
Function IsGroup3(ByVal testvalue As Variant) As Boolean
IsGroup1 = (testvalue > 0)
End Function
次に、条件付き書式で次の数式を使用します。
=IsGroup1(A1)
=IsGroup2(A1)
=IsGroup3(A1)
次に、コードは、セルのcolorを調べるのではなく、条件が満たされているかどうかを確認します。
If IsGroup1(Range("$A$1").Value) Then MsgBox "I'm red!"
セルの条件付き書式の色を取得するには、<Cell>.FormatConditions(index that is active).Interior.ColorIndex
を参照する必要があります。
例については、以下のリンクを参照してください。
http://www.xldynamic.com/source/xld.CFConditions.html#specific
@richardtallentへのフォローアップとして(申し訳ありませんが、コメントはできませんでした)、次のリンクから、条件付き書式を評価してカラーインデックスを返す関数を取得できます。
XlColorIndex EnumerationColorIndex=-4142
によると色なし
なぜこれが起こるのかについては、私は無知です。戻り値はRGB値の10進表現のようです。 このスクリプト の改良版で値を16進RGB表記に復号化します
Function RGB(CellRef As Variant)
RGB = ToHex(Range(CellRef).Interior.Color)
End Function
Function ToHex(ByVal N As Long) As String
strH = ""
For i = 1 To 6
d = N Mod 16
strH = Chr(48 + (d Mod 9) + 16 * (d \ 9)) & strH
N = N \ 16
Next i
strH2 = ""
strH2 = Right$(strH, 2) & Mid$(strH, 3, 2) & Left$(strH, 2)
ToHex = strH2
End Function
Range内のセルの色を取得するには、配列内の個々のセルをRange( "A1"、 "C3")。Cells(1,1)(セルA1の場合)の形式で参照する必要があります。問題が発生しているプロパティの名前を調べると、Excelのヘルプは非常に役立ちます。
また、Excel 2007はカラータイプに整数を使用するため、最善の策は、カラーインデックスを整数に割り当て、それをプログラム全体で使用することです。あなたの例として、以下を試してください。
Green = Range("A1","C3").Cells(1,1).Interior.Color
Yellow = Range("A1","C3").Cells(1,3).Interior.Color
Red = Range("A1","C3").Cells(2,1).Interior.Color
そして、色をすべて赤に切り替えるには:
Range("A1","C3").Interior.Color = Red
繰り返しになりますが、Cells([RowIndex]、[ColumnIndex])の使用方法についてはExcelヘルプを確認してください。
上記がうまくいかない場合は、.Interior.PatternColorIndexが何に等しいかを確認してください。通常はxlAutomatic(単色)に設定したままにしますが、色が変わらない場合は別の色に設定することもできます。
「条件付きフォーマット」の色がプログラムで利用できるようには見えません。代わりに、セルの色を計算する小さな関数を作成し、値を編集するたびにアクティブなセルで実行するようにマクロを設定することをお勧めします。たとえば(疑似コードについては申し訳ありませんが、私はもうVBAの専門家ではありません):
Function GetColorForThisCell(Optional WhatCell as String) as Int
If WhatCell="" Then WhatCell = ActiveCell
If Range(WhatCell).value = -1 then GetColorForThisCell = vbGreen
If Range(WhatCell).value = 0 then GetColorForThisCell = vbYellow
If Range(WhatCell).value = 1 then GetColorForThisCell = vbRed
End Function
Sub JustEditedCell
ActiveCell.color = GetColorForThisCell()
End Sub
Sub GetColorOfACell(WhatCell as string)
Msgbox(GetColorForThisCell(WhatCell) )
End Sub
組み込みのExcel条件付き書式を使用することはできませんが、これで同じことが達成され、コードから色を読み取ることができます。これは意味がありますか?