如何制作 for 循环以应用条件格式?

How to make a for loop to apply conditional formating?

我为第一组列创建了条件格式 (C:E)(见图 3)。

Range("C1:E36").Select
Selection. Format Conditions. Add Type:=xlExpression, Formulal:="=$D6=""Sun"""
Selection. Format Conditions (Selection. FormatConditions. Count).SetFirstPriority
with Selection. Format Conditions (1). Interior
.Pattern = xlLightVertical
. PatternColor = 65535
.ColorIndex = xlAutomatic
.PatternTintAndShade = 0
End With

我正在尝试创建一个 for 循环,它应该应用于所有十二个集合 - 每个集合有 3 列(见图 2)。此外,它应该 运行 3 次 - 从行 C6, C45,C84 开始 - 对应于我要显示的三年(见图 1)。我正在为 for 循环而苦苦挣扎。以及条件格式中 $D6 列的相对 abs 引用以及如何使其成为 $G6, $J6, $D84, $G84.

For o = 1 TO 3 Step 1
    For I = 1 To 12 Step 1
    Range (.Cells(6, I * 3), .Cells (36, I * 3 + 2)).Select
    Selection. Format Conditions. Add Type:=xlExpressionFormulal:="=$D6=""Sun"""
    Selection. Format Conditions (Selection. Format Conditions. Count).SetFirstPriority
    With Selection. Format Conditions (1). Interior
   .Pattern = xlLightvertical
   .PatternColor = 65535
   .ColorIndex = xlAutomatic
   .PatternTintAndShade = 0
    End With
    Next I
Next o
End Sub'

对于复制格式,我建议 .Copy.PasteSpecial 使用 xlPasteFormats。至于动态确定范围,因为您的范围有规则的大小和可预测的位置,最简单的方法是编写静态 For Loop 来迭代行和列号。

Sub Example()
    Dim r As Long, c As Long 
    For r = 6 To 84 Step 39
        For c = 3 To 36 Step 3
            Cells(r, "C").Resize(38, 3).Copy
            Cells(r, c).Resize(38, 3).PasteSpecial xlPasteFormats
        Next
    Next
End Sub

此代码将格式从“C6:E44”复制到相邻列。 12 组,每组 3 列宽(例如“F6:H44”、“I6:K44”)。然后它将行号从 6 增加到 45 并再次执行此操作,将“C45:E83”复制到“F45:H83”和其他 11 个列集。然后它从第 45 行前进到第 84 行并再次执行此操作。

回应您关于为每个范围应用 new/custom 格式的评论:

Sub Example()
    For r = 6 To 84 Step 39
        For c = 3 To 36 Step 3
            ApplyFormatting Cells(r, c).Resize(38, 3)
        Next
    Next
End Sub

Sub ApplyFormatting(InRange As Range)
    InRange.FormatConditions.Add Type:=xlExpression, Formula1:="=" & InRange.Cells(1, 2).Address(False, True) & "=""Sun"""
    InRange.FormatConditions(InRange.FormatConditions.Count).SetFirstPriority
    With InRange.FormatConditions(1).Interior
        .Pattern = xlLightVertical
        .PatternColor = 65535
        .ColorIndex = xlAutomatic
        .PatternTintAndShade = 0
    End With
End Sub

此过程 ApplyFormatting 获取每个范围并将地址用作应用于整个范围的新格式公式的一部分。

这样做会简单得多:

  1. 创建条件格式,以便上下复制
  2. 将格式复制并粘贴到其他位置

要做 1) 为每个单元格 C6、D6 和 E6 分别定义条件格式 ,使用公式:=OR(D6="Sat",D6="Sun").

您现在可以执行 2):

  1. Select 个单元格 C6:E6 和复制
  2. Select 目标组(比如)F6:H36 和粘贴格式
  3. 现在将格式复制F6:H36并粘贴到每个其他列组

您可以根据需要定义一个 CF 作为传递范围的 Sub。然后根据需要多次调用它,以设置所有列

设置条件格式

Sub SetCF(r As Range)
    Dim rw As Long
    r.FormatConditions.Add Type:=xlExpression, Formula1:="=" & r.Cells(1, 2).Address(False, True) & "=""Sun"""
    r.FormatConditions(r.FormatConditions.Count).SetFirstPriority
    With r.FormatConditions(1).Interior
        .Pattern = xlLightVertical
        .PatternColor = 65535
        .ColorIndex = xlAutomatic
        .PatternTintAndShade = 0
    End With
End Sub

为一个范围调用它

Sub Demo1()
    SetCF ActiveSheet.Range("C1:E36")
End Sub

为多个偏移范围调用它

Sub Demo2()
    Dim r As Range
    Dim i As Long
    
    Set r = ActiveSheet.Range("C1:E36")
    For i = 0 To 11
        SetCF r.Offset(, i * 3)
    Next
End Sub