在未选择的范围上设置FormatCondition时,这会失败吗?

时间:2013-07-25 21:02:31

标签: excel excel-vba format excel-2007 conditional-statements vba

我有这个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中,这可以正常工作吗?

2 个答案:

答案 0 :(得分:2)

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

让我解释一下您的具体情况:

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

选择使用条件格式的范围后,该行永远不会更改,因为您位于同一行。希望这是有道理的。

答案 1 :(得分:2)

微软有a kb article!关于这个问题。

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