VBA 条件格式

VBA Conditional Formatting

我正在努力寻找一种优雅的方式来通过 VBA 应用条件格式规则。我更喜欢 VBA,因为 a) 规则将适用于多个工作 sheet,并且 b) 当 copying/pasting 在工作 sheet 之间时,它可以防止 CF 重复问题。

我有一份清单,所有物品都保存在不同的位置。我想使用以下格式根据位置进行格式化:

字体颜色(每个位置都会改变);顶部边框(与字体颜色相同);底部边框(与字体颜色相同)

此外,对于每个作品sheet,范围需要是动态的,它适用于 sheet 上的 table。我想将相同的代码应用于每个适用的作品sheet,而不需要为每个作品sheet.

硬编码 table 名称

如有任何帮助,我们将不胜感激。


--更新-- 我尝试改编 J_V 的代码 here,但在 Public Sub 的 r.FormatConditions.Add Type:=xlExpression, Formula1:=formula 上收到 "Run-time error '5': Invalid procedure call or argument"。我不确定边界上的最后一位是否正确,因为运行时会停止宏。我还需要处理动态 table 参考资料,但我一次处理一个问题。

Sub ConditionalFormatting()

Dim myRange As Range
Set myRange = ThisWorkbook.Sheets("Widget1").Range("Widget1_table[Location]")

myRange.FormatConditions.Delete

Call FormatRange(myRange, 10, "=$E5="Warehouse1")
Call FormatRange(myRange, 11, "=$E5="Warehouse2")
Call FormatRange(myRange, 13, "=$E5="Warehouse3")

End Sub

Public Sub FormatRange(r As Range, color As Integer, formula As String)
r.FormatConditions.Add Type:=xlExpression, Formula1:=formula
r.FormatConditions(r.FormatConditions.Count).Font.colorindex = color

With r.FormatConditions(1).Borders(xlTop)
    .LineStyle = xlContinuous
    .Color = color
    .TintAndShade = 0
    .Weight = xlThin
End With
With r.FormatConditions(1).Borders(xlBottom)
    .LineStyle = xlContinuous
    .Color = color
    .TintAndShade = 0
    .Weight = xlThin
End With
r.FormatConditions(1).StopIfTrue = False

End Sub

问题实际上不在 Sub FormatRange 内,而是在 Sub ConditionalFormatting 内调用公式时分配公式的方式。该公式包含一个字符串,因此引号必须像这样加倍。

Sub ConditionalFormatting()
    Dim myRange As Range
    Set myRange = ThisWorkbook.Sheets("Widget1").Range("Widget1_table[Location]")

    myRange.FormatConditions.Delete

    Call FormatRange(myRange, 10, "=$E5=""Warehouse1""")
    Call FormatRange(myRange, 11, "=$E5=""Warehouse2""")
    Call FormatRange(myRange, 13, "=$E5=""Warehouse3""")
End Sub

至于第二个宏,当您添加新条件时,它会排到队列底部。如果您查看创建 CF 规则的记录输出,您会发现它通常包含行,

    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority

这会将 CF 规则放在队列的顶部,以便此后可以将其称为 .FormatConditions(1)。如果您不希望它位于队列的顶部,那么您必须像这样在队列中将其称为 last

Public Sub FormatRange(r As Range, clr As Integer, frml As String)
    r.FormatConditions.Add Type:=xlExpression, Formula1:=frml
    r.FormatConditions(r.FormatConditions.Count).Font.ColorIndex = clr

    With r.FormatConditions(r.FormatConditions.Count).Borders(xlTop)
        .LineStyle = xlContinuous
        .ColorIndex = clr
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With r.FormatConditions(r.FormatConditions.Count).Borders(xlBottom)
        .LineStyle = xlContinuous
        .ColorIndex = clr
        .TintAndShade = 0
        .Weight = xlThin
    End With
    r.FormatConditions(r.FormatConditions.Count).StopIfTrue = False
End Sub

我还将您的边框 .Color 分配更改为 .ColorIndex,因为 10、1113 似乎是 *green、blue 和 purpleColorIndex 标识符。元音已从您的变量名称中删除,以避免与集合属性的名称发生冲突。