我有这个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中,这可以正常工作吗?
答案 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!关于这个问题。
似乎确认了问题,但建议使用绝对引用或选择单元格作为解决方法。