修改VBA以考虑条件格式

时间:2016-08-06 07:18:28

标签: excel-vba vba excel

我试图在Excel 2016中使用类似COUNTIF的功能按照背景颜色总计一系列单元格... 3种不同颜色(绿色,黄色,红色)代表3种不同的“状态”(第一大,第二大,第三大)。我设法通过使用这个VBA编码来实现它:

Function Countcolour(rng As Range, colour As Range) As Long
 Dim c As Range
 Application.Volatile
 For Each c In rng
     If c.Interior.ColorIndex = colour.Interior.ColorIndex Then
         Countcolour = Countcolour + 1
     End If
 Next
 End Function

但是,此特定代码未考虑条件格式。

因此,例如,我尝试有条件地格式化一组数据以突出显示其第一个最大值绿色,第二大黄色,第三大红色。我在另一个块中使用此VBA函数来计算所有绿色高光。但是,由于条件格式化,它不会拾取单元格的背景颜色。

我确定我错过了一些明显的东西......我觉得If条件的第一部分应该是c.FormatCondition.Interior的某种形式,但我尝试过主题的变化没有成功。

提前感谢您提供的任何帮助!

1 个答案:

答案 0 :(得分:0)

这是包括我在内的许多人尝试做的事情。

互联网上有一些有用的代码,例如http://www.cpearson.com/excel/CFColors.htm 但经过大量搜索后,我发现答案中只有一个 get conditional formatted color with vba in excel,它可以正常工作!

解决方案很简单:

您可以使用

.cells(1,1).displayformat.interior.color 

.cells(1,1).displayformat.interior.colorIndex

示例:

Function CountColor(ByRef rng As Range, ByRef color As Long) As Variant
    Dim total: total = 0
    If (Not (rng Is Nothing)) Then
        Dim element As Variant
        For Each element In rng
            total = total - (element.DisplayFormat.Interior.color = color) ' MINUS because TRUE evaluates to -1
        Next element
    End If
    CountColor = total
End Function

Sub test_countColors()
    With Sheet1
        Dim rng As Range
        Dim color As Long
        Dim total As Long
        Set rng = Range(.Cells(1, 1), .Cells(3500, 55))   ' Or anay other range
        color = 8438015                                   ' Or any other color
        total = CountColor(rng, color)  
        MsgBox "Total= " & total
    End With
End Sub