我有这样的价值观:
如果值高于 -5 或 +5,它们也是红色。所有趋向于 0 的东西都会变得更绿,就像屏幕截图一样。 使用条件格式对每一列进行格式化的工作量很大。这就是我们目前的做法。
是否可以使用一个公式来为单元格背景着色,就像我在屏幕截图中所做的那样?尤其是从红色到黄色到绿色的渐变?
这里有更多数据。
答案1
基于 VBA 的解决方案的提议。您定义两个颜色标度:一个用于负数,一个用于正数。您需要选择两个单元格(分隔)作为参考单元格。我选择了A6
和C6
。您可以将整个调色板放在那里,但这不是必需的,只需一个单元格就足够了。在这些单元格中,将首先定义颜色标度(并且只定义一次),然后根据值是负数还是正数为新单元格分配适当的标度。
定义主要标度后,您需要指定要格式化的单元格范围(G4:K11
在示例中),并AppendRange
以该范围作为参数调用该过程。只有包含数字的单元格才会被格式化。
如果分配了标度,您可以更改格式化单元格的值,但不能更改符号。如果单元格更改了符号或添加了新符号,请AppendRange
再次调用该过程。您需要做的就是将这些新的或更改的单元格指定为范围。
Option Explicit
Const CGreen = 8109667, CYellow = 8711167, CRed = 7039480
Public patplus As Range, patminus As Range
Sub AddRangeToCF(rng1, rng2)
Set patplus = rng1
DefPlus patplus.CurrentRegion
Set patminus = rng2
DefMinus patminus.CurrentRegion
End Sub
Sub DefPlus(rng As Range)
rng.FormatConditions.Delete
With rng.FormatConditions.AddColorScale(ColorScaleType:=3)
.ColorScaleCriteria(1).Type = xlConditionValueNumber
.ColorScaleCriteria(1).Value = 0
.ColorScaleCriteria(1).FormatColor.Color = CGreen
.ColorScaleCriteria(2).Type = xlConditionValuePercent
.ColorScaleCriteria(2).Value = 50
.ColorScaleCriteria(2).FormatColor.Color = CYellow
.ColorScaleCriteria(3).Type = xlConditionValueNumber
.ColorScaleCriteria(3).Value = 5
.ColorScaleCriteria(3).FormatColor.Color = CRed
End With
End Sub
Sub DefMinus(rng As Range)
rng.FormatConditions.Delete
With rng.FormatConditions.AddColorScale(ColorScaleType:=3)
.ColorScaleCriteria(1).Type = xlConditionValueNumber
.ColorScaleCriteria(1).Value = -5
.ColorScaleCriteria(1).FormatColor.Color = CRed
.ColorScaleCriteria(2).Type = xlConditionValuePercent
.ColorScaleCriteria(2).Value = 50
.ColorScaleCriteria(2).FormatColor.Color = CYellow
.ColorScaleCriteria(3).Type = xlConditionValueNumber
.ColorScaleCriteria(3).Value = 0
.ColorScaleCriteria(3).FormatColor.Color = CGreen
End With
End Sub
Sub AppendCell(cell As Range)
If Application.IsNumber(cell.Value) Then
Select Case cell.Value
Case Is >= 0
DefPlus Union(cell, FindSame(patplus))
Case Is < 0
DefMinus Union(cell, FindSame(patminus))
End Select
End If
End Sub
Function FindSame(pat As Range) As Range
Set FindSame = pat.SpecialCells(xlCellTypeSameFormatConditions)
End Function
Sub AppendRange(rng As Range)
Dim rngplus As Range, rngminus As Range, cell As Range
Set rngplus = patplus
Set rngminus = patminus
For Each cell In rng
If Application.IsNumber(cell.Value) Then
Select Case cell.Value
Case Is >= 0
Set rngplus = Union(rngplus, cell)
Case Is < 0
Set rngminus = Union(rngminus, cell)
End Select
End If
Next cell
If rngplus.Count > 1 Then DefPlus Union(rngplus, FindSame(patplus))
If rngminus.Count > 1 Then DefMinus Union(rngminus, FindSame(patminus))
End Sub
Sub Test()
AddRangeToCF Range("C6"), Range("A6")
AppendRange Range("G4:K11")
End Sub