【问题标题】:Excel 2007 conditional formatting - how to get cell color?Excel 2007 条件格式 - 如何获取单元格颜色?
【发布时间】:2010-11-03 00:59:26
【问题描述】:

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

Range("A1").Interior.Color 总是返回 16777215 Range("A1").Interior.ColorIndex 总是返回 -4142

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

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

【问题讨论】:

    标签: excel excel-2007 vba


    【解决方案1】:

    根据XlColorIndex EnumerationColorIndex=-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
    

    【讨论】:

    • 我只对单元格的颜色或颜色索引感兴趣(使用条件格式着色)...无论如何谢谢
    【解决方案2】:

    要获取 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(纯色),如果颜色没有变化,它可以设置为其他值。

    【讨论】:

    • MsgBox Range("A1", "C3").Cells(1, 1).Interior.Color MsgBox Range("A1", "C3").Cells(1, 1).Interior .ColorIndex 这两个仍然分别返回相同的 16777215 和 -4142
    • MsgBox Range("A1", "C3").Cells(1, 1).Interior.PatternColorIndex 这返回 -4142
    • 您是否尝试过通过代码手动更改背景颜色?
    • 不是条件格式——手动设置单元格的颜色。作为参考,绿色为5287936,黄色为65535,红色为255,
    • 如果手动,那么我也知道如何获取颜色信息...我在获取有条件格式化的单元格颜色时遇到问题
    【解决方案3】:

    .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!"
    

    【讨论】:

    • 你能告诉我如何获得条件格式的颜色吗?
    • 我怎样才能增加你答案的重要性?
    • 点击我的答案左侧数字“0”上方的“向上”按钮,或者如果这是您要接受的答案,请点击出现在左侧的勾勒出的“勾选”我的回答。
    • 问题是它会询问我复制和粘贴的 openid 并且它不接受
    • 您需要 15+ 声望才能投票,目前只有 11 个声望。您应该对所有有帮助的问题进行投票,然后单击复选标记以获得最佳答案。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

        因为我一次可能有超过三种不同的颜色...我没有找到任何使用条件格式的默认颜色处理此问题的好方法...我是这样做的。然后每当我询问单元格的颜色时,我都会检索到正确的颜色!

         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!

        【讨论】:

          【解决方案7】:

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

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

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

          【讨论】:

          • +1,但请注意 &lt;Cell&gt;.FormatConditions(index that is active) 返回一个需要转换为类型 FormatCondition 的对象。
          猜你喜欢
          • 1970-01-01
          • 2013-06-03
          • 2020-06-01
          • 2011-11-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多