【问题标题】:VBA Conditional Formatting with changable conditions具有可变条件的 VBA 条件格式
【发布时间】:2017-11-13 06:35:52
【问题描述】:

我正在尝试在第三列 ("C") 的 18 个单元格中设置条件格式。我在第一列(“A”)中合并了每 6 个单元格,在第二列(“B”)中合并了未合并的(正常)单元格。我正在尝试检查“C”列中的每个下一个单元格,如果“A”列的第一行中有“是”,或者“A”列中是否有“否”并且“通过”在“ B”栏。诀窍是,我只想检查“A”列的第一行,第七、第十三和第十九(因此步骤 = 6)并检查“B”列中的每一行。我尝试这样的事情:

Sub try()
    Dim i As Integer
    Dim j As Integer
    i = 1

    For j = 1 To 12
        With Range("C1:C18")
            .FormatConditions.Delete
            .FormatConditions.Add Type:=xlExpression, Formula1:="=OR(Cells(i, 1) = ""Yes""; AND(Cells(i, 1) = ""No""; Cells(j, 2) = ""Pass""))"

        End With
        If j Mod 6 = 0 Then 
            i = i + 6

    Next j
End Sub

但它不是那样工作的,我看到了带有特定单元格的示例,例如“A1”或“A3”,但我希望每个循环都增加一个数字(所以我尝试使用 Cells(row,column))。

【问题讨论】:

    标签: excel vba formatting conditional cells


    【解决方案1】:

    您可以使用相对地址在整个范围的一个语句中执行此操作,因此适用于 C1 相对于 A1B1 的内容将自动出现在该范围的后续行中。

    唯一的技巧是检索列A 中的值,因为该值仅在单元格A1A7 等中可用。这是通过表达式OFFSET(A1,-MOD(ROW(C1)-1,6),0) 实现的。

    Sub doIt()
      With Sheet1.Range("C1:C30").FormatConditions
        .Delete
        .Add(xlExpression, , _
          "=OR(OFFSET(A1,-MOD(ROW(C1)-1,6),0)=""yes"",AND(OFFSET(A1,-MOD(ROW(A1)-1,6),0)=""no"",B1=""pass""))") _
          .Interior.ColorIndex = 6
      End With
    End Sub
    

    您也可以使用相同的公式从 GUI 执行此操作;选择单元格C1然后选择整个范围C1:C30,然后点击

    Conditional Fomatting -> New rule -> Use a formula... 并输入相同的公式。

    顺便说一句,如果您不关心检查 "no",则表达式可以进一步简化,这意味着如果 A 列确定为“是”或“否”。

    【讨论】:

    • @Asia 该代码已经过全面测试,并且完全按照您的描述工作。检查您是否有sheet1,并且您合并的区域是:A1:A6A7:A12A13:A18A19:A24A25:A30。在您的 OP 中有一个错误说明:““A”列的第一行,第六、第十二和第十八(因此,步长 = 6)” 如果步长为 6,则行应为 1, 7, 13, 19 ,这是我在回答中考虑的。但你需要验证它。
    • 是的,我的意思是 1、7、13 和 19。但我仍然收到此消息:'Run-time error '5' Invalid procedure call or arument'
    • 对不起,我想不通。该代码非常适合我,所以我不知道您的设置可能出了什么问题。
    猜你喜欢
    • 2015-02-28
    • 2017-03-05
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多