如何制作一个 for 循环来应用条件格式?

Posted

技术标签:

【中文标题】如何制作一个 for 循环来应用条件格式?【英文标题】:How to make a for loop to apply conditional formating? 【发布时间】:2022-01-01 10:21:56 【问题描述】:

我为第一组列 (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 循环,它应该应用于所有 12 个集合 - 每个集合有 3 列(参见图 2)。此外,它应该运行 3 次 - 从行 C6, C45,C84 开始 - 对应于我试图显示的三年(见图 1)。我正在为 for 循环而苦苦挣扎。以及条件格式中$D6 列的相对绝对引用以及如何使其成为$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'

【问题讨论】:

没有代码图片。请编辑帖子以将代码包含为文本。对于代码格式化,在代码块前后的单独行上使用代码围栏```。 手动复制前三列并三三粘贴不起作用吗? 【参考方案1】:

您可以根据需要定义一个 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

【讨论】:

你用这个答案击败了我不到一分钟......荣誉!【参考方案2】:

对于复制格式,我建议.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 行并再次执行此操作。

回应您的 cmets 关于为每个范围应用新/自定义格式:

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 采用每个范围并将地址用作应用于整个范围的新格式公式的一部分。

【讨论】:

这似乎在复制粘贴的意义上起作用。但它仍然引用原始集合——因为 $D6 的引用值。它不是动态的。 @Nathan Fleischman:请参阅我的答案,了解如何制作条件格式以便复制。 请参阅我的更新答案,了解如何将自定义公式应用于每个范围。【参考方案3】:

这样会更简单:

    创建条件格式,以便向下和横向复制 将格式复制并粘贴到其他位置

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

您现在可以执行 2):

    选择单元格 C6:E6 并复制 选择一个目标组(比如)F6:H36 并粘贴格式 现在复制 F6:H36 并将格式粘贴到其他每个列组

【讨论】:

这将仅突出显示中心列。我需要它应该突出显示集合的整行。这就是为什么我将其设为 $D6 而不是 D6。 呃……不,不会的。重新阅读“待办事项 1)”。关键是分别在每个单元格(C6、D6、E6)中定义条件,但在每种情况下使用相同的公式。

以上是关于如何制作一个 for 循环来应用条件格式?的主要内容,如果未能解决你的问题,请参考以下文章

无限循环与嵌套循环

如何从For循环中制作流

ASP中的条件语句和循环语句

在java中,新循环,也就是增强for循环怎么用?是啥格式?

九while 条件循环语句case 条件测试语句计划任务服务程序

JavaScript语法详解:if语句&for循环&函数