如何在VBA中设置背景颜色,以便在公式中检测到它?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在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
如果使用公式确定要格式化的单元格,则使用条件格式对单元格进行着色,此UDF将计算具有该颜色的单元格数(从Microsoft Community改编)。
您通常可以通过使用范围的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,您需要遍历每个范围并评估与条件格式关联的公式。
这种方法有两个轻微的皱纹:
- 你需要确定哪个
FormatCondition
你要考虑Range
,如果有多个。 - 与“正确”
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
截图
以上是关于如何在VBA中设置背景颜色,以便在公式中检测到它?的主要内容,如果未能解决你的问题,请参考以下文章