VBA条件格式

VBA条件格式,vba,excel,conditional-formatting,Vba,Excel,Conditional Formatting,我正在努力找到一种通过VBA应用条件格式规则的优雅方法。我更喜欢VBA,因为a)规则将应用于多个工作表,b)它可以防止在工作表之间复制/粘贴时出现CF重复问题 我有一份库存物品清单,所有物品都存放在不同的地方。我希望使用以下格式基于位置设置格式: 字体颜色(每个位置都会改变);上边框(与字体颜色相同);底部边框(与字体颜色相同) 此外,范围需要是动态的,因为对于每个工作表,它适用于该工作表上的表。我希望对每个适用的工作表应用相同的代码,而不需要为每个工作表硬编码表名 任何帮助都将不胜感激 --

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

我有一份库存物品清单,所有物品都存放在不同的地方。我希望使用以下格式基于位置设置格式:

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

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

任何帮助都将不胜感激


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

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 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, 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
至于第二个宏,当您添加新条件时,它将进入队列的底部。如果查看创建CF规则时记录的输出,您将看到它通常包含以下行:

    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
这会将CF规则放在队列的顶部,以便以后可以将其称为
.FormatConditions(1)
。如果您不希望它位于队列的顶部,则必须将其称为队列中的最后一个,如下所示

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, 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绿色、蓝色和紫色的标识符。已从变量名称中删除元音,以避免与集合属性的名称冲突。

问题实际上不在
子格式范围内,而是在
子条件格式中调用公式时分配公式的方式。公式包含一个字符串,因此引号必须像这样折叠起来

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, 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
至于第二个宏,当您添加新条件时,它将进入队列的底部。如果查看创建CF规则时记录的输出,您将看到它通常包含以下行:

    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
这会将CF规则放在队列的顶部,以便以后可以将其称为
.FormatConditions(1)
。如果您不希望它位于队列的顶部,则必须将其称为队列中的最后一个,如下所示

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, 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绿色、蓝色和紫色的标识符。已从变量名称中删除元音,以避免与集合属性的名称冲突。

问题实际上不在
子格式范围内,而是在
子条件格式中调用公式时分配公式的方式。公式包含一个字符串,因此引号必须像这样折叠起来

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, 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
至于第二个宏,当您添加新条件时,它将进入队列的底部。如果查看创建CF规则时记录的输出,您将看到它通常包含以下行:

    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
这会将CF规则放在队列的顶部,以便以后可以将其称为
.FormatConditions(1)
。如果您不希望它位于队列的顶部,则必须将其称为队列中的最后一个,如下所示

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, 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绿色、蓝色和紫色的标识符。已从变量名称中删除元音,以避免与集合属性的名称冲突。

问题实际上不在
子格式范围内,而是在
子条件格式中调用公式时分配公式的方式。公式包含一个字符串,因此引号必须像这样折叠起来

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, 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
至于第二个宏,当您添加新条件时,它将进入队列的底部。如果查看创建CF规则时记录的输出,您将看到它通常包含以下行:

    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
这会将CF规则放在队列的顶部,以便以后可以将其称为
.FormatConditions(1)
。如果您不希望它位于队列的顶部,则必须将其称为队列中的最后一个,如下所示

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, 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绿色、蓝色和紫色的标识符。已将元音从变量名中删除,以避免与集合属性的名称冲突。

我将首先录制一个将CF应用于一个表的宏。然后通过在工作簿中的每个工作表中循环,并在必要时在这些工作表中的每个listobject(表)中循环来展开它。将变量命名为集合属性的保留字是一个非常糟糕的主意
Formula1:=formula
是不可取的,但
。Color=Color
完全是错误的。感谢大家的提醒,我将重命名变量。我将首先录制一个将CF应用于一个表的宏。然后通过在工作簿中的每个工作表中循环,并在必要时在这些工作表中的每个listobject(表)中循环来展开它。将变量命名为集合属性的保留字是一个非常糟糕的主意<代码>公式1:=公式
不可取