VBA条件格式

时间:2015-01-01 20:47:13

标签: excel vba excel-vba conditional-formatting

我正在努力想出一种通过VBA应用条件格式规则的优雅方法。我更喜欢VBA,因为a)规则适用于多个工作表,b)它可以防止在工作表之间复制/粘贴时出现CF复制问题。

我有一个库存物品清单,全部保存在不同的位置。我想根据位置进行格式化,格式如下:

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

此外,范围需要是动态的,因为对于每个工作表,它适用于该工作表上的表。我想将相同的代码应用于每个适用的工作表,而不是需要对每个工作表的表名进行硬编码。

非常感谢任何帮助。


- UPDATE-- 我尝试调整J_V的代码here,但收到"运行时错误' 5':无效的过程调用或参数"在Public Sub' r.FormatConditions.Add Type:=xlExpression, Formula1:=formula上。我不确定边框上的最后一位是否正确,因为运行时会停止宏。我还需要使用动态表引用,但我一次只能处理一个问题。

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

1 个答案:

答案 0 :(得分:3)

问题实际上不在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,11 & 13 似乎是 ColorIndex 标识符,用于*绿色,蓝色和紫色。从变量名中删除了元音,以避免与集合属性的名称冲突。