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、11 和 13 似乎是 *green、blue 和 purple 的 ColorIndex 标识符。元音已从您的变量名称中删除,以避免与集合属性的名称发生冲突。
我正在努力寻找一种优雅的方式来通过 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、11 和 13 似乎是 *green、blue 和 purple 的 ColorIndex 标识符。元音已从您的变量名称中删除,以避免与集合属性的名称发生冲突。