如何在VBA中设置背景颜色,以便可以在公式中检测到背景颜色?

时间:2018-07-31 16:29:44

标签: excel vba

我正在使用以下代码将B列中的重复值设置为红色。我不记得它的来源。我添加了计数器和msgbox,以查看发生了什么事。 B列中的重复值以红色突出显示。

Sub formatduplicates2()
Dim rg As Range
Dim cf As FormatCondition
Dim datax As Range
Dim xcolor As Long
Dim colorcount
Dim count

colorcount = 1
Set rg = Range("B17", Range("B17").End(xlDown))
Set cf = rg.FormatConditions.Add(Type:=xlExpression, Formula1:="=COUNTIF(B$17:B17,B17)>1")
cf.Interior.Color = RGB(255, 0, 0)
For Each datax In rg
    count = count + 1
    If count = 10000 Then
        MsgBox count
    End If
Next datax

End Sub

我正在使用以下功能对所有红细胞进行计数。这是来自Ozgrid。如果我手动更改单元格的背景颜色,它将起作用。

该函数看不到使用上面的代码更改的单元格。当我手动检查B列中的单元格的背景颜色(明显为红色的单元格)时,Excel告诉我RGB设置为0,0,0(无填充)。重新计算或保存并重新打开文件的数量不会更改任何内容。单元格显示为红色,但与之关联的数据为“未填充”。

我的目标是计算给定背景的细胞。

Function ColorFunction(rColor As Range, rRange As Range, Optional StrCond As String) As Long

    Dim rCell As Range
    Dim lCol As Long
    Dim vResult As Long

    lCol = rColor.Interior.Color

    For Each rCell In rRange
        If rCell.Interior.Color = lCol Then
            If StrCond <> "" Then
                If rCell.Value = StrCond Then
                    vResult = vResult + 1
                End If
            Else
                vResult = vResult + 1
            End If
        End If
    Next rCell

    ColorFunction = vResult
End Function

1 个答案:

答案 0 :(得分:0)

如果您要使用条件格式对单元格进行着色,使用公式来确定要格式化的单元格,则该UDF将计算具有该颜色的单元格数量(改编自Microsoft Community)。 / p>

通常可以通过使用范围的DisplayFormat.Interior.Color而不是其Interior.Color来确定通过条件格式应用的颜色。如果您修改了ColorFunction以查看rCell.DisplayFormat.Interior.Color并在Sub中使用了该功能,即类似这样,它将正常工作。

Sub Test
    Range("A2").Value = ColorFunction(Range("A1"), Range("B17:B20"))
End Sub

但是ColorFunction 不能作为UDF使用-您的#Value!错误如注释中所述。我不确定原因,但显然使用Range.DisplayFormat不能用于UDF。因此,要拥有UDF,您需要遍历每个范围并评估与条件格式关联的公式。

该方法有两个轻微的皱纹:

  1. 如果有多个,则需要确定要考虑的FormatCondition中的哪个Range
  2. 与“正确” FormatCondition相关联的公式(在您的原始情况下为=COUNTIF(B$17:B17,B17)>1)将不会自动更新相对引用(如果有)。您需要使用Application.ConvertFormula,从 A1 转换为 R1C1 (并返回到 A1 )参考样式,同时使用 RelativeTo 参数以更新相对引用。

Function CountConditionColorCells(CellsRange As Range, ColorRng As Range) As Long
    Dim RightCF As Boolean
    Dim CFformula As String
    Dim CFCELL As Range
    Dim CFcounter, CFtrueCounter As Long, CFCellCounter As Long

    ' Determines which conditional format to consider, if multiple
    For CFcounter = 1 To CellsRange.FormatConditions.Count
        If CellsRange.FormatConditions(CFcounter).Interior.ColorIndex = ColorRng.Interior.ColorIndex Then
            RightCF = True
            Exit For
        End If
    Next CFcounter

    If RightCF Then
        For Each CFCELL In CellsRange
            CFformula = CFCELL.FormatConditions(CFcounter).Formula1
            CFformula = Application.ConvertFormula(CFformula, xlA1, xlR1C1)
            CFformula = Application.ConvertFormula(CFformula, xlR1C1, xlA1, , _
                ActiveCell.Resize(CellsRange.Rows.Count, CellsRange.Columns.Count).Cells(CFCellCounter + 1))

            If Evaluate(CFformula) Then CFtrueCounter = CFtrueCounter + 1

            CFCellCounter = CFCellCounter + 1
        Next CFCELL
    Else
        Exit Function ' Returns 0
    End If

    CountConditionColorCells = CFtrueCounter
End Function

屏幕截图

enter image description here