假设我有以下范围(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,为什么?
答案 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的后续内容(抱歉,我无法发表评论),以下链接将为您提供一个函数,通过为您评估条件格式来返回颜色索引。
答案 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!