我正在努力想出一种通过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
答案 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 标识符,用于*绿色,蓝色和紫色。从变量名中删除了元音,以避免与集合属性的名称冲突。