1

我有这个 VBA 代码:

Private Sub Worksheet_Activate()
    Sheet1.Cells(10, 10).Select

    Range("$B$2:$E$7").FormatConditions.Delete
    With Range("$B$2:$E$7").FormatConditions.Add(Type:=xlExpression, Formula1:="=$G2=""Yes""")
        .Interior.Color = RGB(150, 100, 0)
    End With
    Debug.Print "Formula is wrong   : " & Range("$B$2:$E$7").FormatConditions(1).Formula1

    Range("$B$2:$E$7").Select
    Range("$B$2:$E$7").FormatConditions.Delete
    With Range("rngDatesLockedRange").FormatConditions.Add(Type:=xlExpression, Formula1:="=$G2=""Yes""")
        .Interior.Color = RGB(150, 100, 0)
    End With
    Debug.Print "Formula is correct : " & Range("$B$2:$E$7").FormatConditions(1).Formula1
End Sub


调试跟踪显示:

Formula is wrong   : =$G1048570="Yes"
Formula is correct : =$G2="Yes"

为什么在将格式应用于该范围之前不选择范围时它不起作用?在 Excel 2010 中,这工作正常吗?

4

2 回答 2

2

Excel 中的条件格式(至少在 2007 年)将使规则相对于格式规则的起始位置您的当前选择。请注意,如果您使用绝对引用字符,则不会发生这种情况。$

让我解释一下你的具体情况发生了什么:

立即您的宏选择单元格,10,10J10. 现在您正在使用该公式=$G2="YES",并且由于您拥有该列的绝对引用,该$G列将永远不会改变。但是,该行将相对于条件开始的位置(即B2)发生变化。好吧10-2=8,它会将行向上移动 8 个空格,因为您从行开始,2它将被8-2=6空格溢出。Excel 2007 中有1048576行,因此您会看到1048570因为1048576 - 6 = 1048570. 导致你的最终公式=$G1048570="YES"

一旦您选择了使用条件格式的范围,该行就永远不会改变,因为您在同一行上。希望这是有道理的。

于 2013-07-25T21:30:44.023 回答
2

微软有一篇 kb 文章!在这个确切的问题上。

它似乎确认了问题,但建议使用绝对引用或选择单元格作为解决方法。

于 2013-07-26T07:52:04.053 回答