13

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

Range("A1").Interior.Color 始终返回 16777215 Range("A1").Interior.ColorIndex 始终返回 -4142

(不管A1的颜色是红蓝绿……)

Range("A1", "C3").FormatConditions.Count 这个总是返回0,为什么?

4

7 回答 7

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!"
于 2009-06-15T14:40:08.480 回答
6

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

您可以参考以下链接作为示例:

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

于 2011-09-23T06:13:49.550 回答
3

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

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

于 2009-06-17T06:44:21.417 回答
0

根据XlColorIndex 枚举 ColorIndex=-4142意味着没有颜色

至于为什么会发生这种情况,我一无所知。返回的值似乎是 RGB 值的十进制表示。此脚本的改进版本,用于将值解密为十六进制 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
于 2009-06-15T14:33:01.213 回答
0

要获取 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

再次查看 Excel 帮助,了解如何使用 Cells([RowIndex],[ColumnIndex])。

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

于 2009-06-15T14:33:46.857 回答
0

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

于 2009-06-15T16:21:52.447 回答
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!

于 2009-06-18T15:17:17.930 回答