Excel 2007条件格式 - 如何获取单元格颜色?

时间:2009-06-15 14:21:46

标签: excel-vba excel-2007 vba excel

假设我有以下范围(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 但它并不是说它是绿色的,为什么呢?你能帮助我吗?

范围(“A1”)。Interior.Color始终返回16777215 范围(“A1”)。Interior.ColorIndex始终返回-4142

(无论A1的颜色是红色,蓝色,绿色......)

范围(“A1”,“C3”)。FormatConditions.Count 这一个总是返回0,为什么?

7 个答案:

答案 0 :(得分:10)

.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)

然后你的代码,而不是查看单元格的颜色,看看是否满足条件:

If IsGroup1(Range("$A$1").Value) Then MsgBox "I'm red!"

答案 1 :(得分:6)

您需要引用<Cell>.FormatConditions(index that is active).Interior.ColorIndex来检索单元格的条件格式颜色。

您可以参考以下链接获取示例:

http://www.xldynamic.com/source/xld.CFConditions.html#specific

答案 2 :(得分:3)

作为@richardtallent的后续内容(抱歉,我无法发表评论),以下链接将为您提供一个函数,通过为您评估条件格式来返回颜色索引。

http://www.bettersolutions.com/excel/EPX299/LI041931911.htm

答案 3 :(得分:0)

根据XlColorIndex Enumeration ColorIndex=-4142表示无颜色

至于为什么会发生这种情况我很无能为力。返回值似乎是RGB值的十进制表示。 this script的改进版本将值解密为十六进制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

答案 4 :(得分:0)

要获取范围中单元格的颜色,需要以范围(“A1”,“C3”)的形式引用数组内的单个单元格。单元格(1,1)(对于单元格A1) 。如果您查找遇到问题的属性的名称,Excel帮助非常好。

此外,Excel 2007使用Integers作为其颜色类型,因此最好将颜色索引分配给整数,并在整个程序中使用它。对于您的示例,请尝试:

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

再次,检查Excel帮助以了解如何使用单元格([RowIndex],[ColumnIndex])。

如果上述方法不起作用,请检查.Interior.PatternColorIndex等于什么。我通常将它设置为xlAutomatic(纯色),如果颜色没有变化,它可以设置为其他东西。

答案 5 :(得分:0)

似乎没有“条件格式”-color以编程方式可用。相反,我建议您编写一个计算单元格颜色的小函数,然后只要设置一个宏,就可以在编辑该值时在活动单元格上运行它。例如(抱歉伪造的代码 - 我不再是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条件格式,但这可以完成同样的事情,并且您可以从代码中读取颜色。这有意义吗?

答案 6 :(得分:0)

因为我可能在一段时间内有三种以上的不同颜色...我没有找到任何使用条件格式的默认颜色来处理它的好方法......我这样做了。然后每当我问到细胞的颜色时,我都会检索到正确的颜色!

 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!