Excel VBA条件格式自动更改

题:
是否有任何会导致FormatConditions.Add方法的Formula1参数自动更改,或者从Excel-VBAmacros中的硬编码更改?
如果是的话,这个行为的文档在哪里?

问题描述:
FormatConditions.Add方法应用于范围时,公式与代码中指定的内容不匹配。

我的macros代码将一个公式分配给名为ConditionalRangeFormula的variables。 运行macros之后,实际的条件格式公式与ConditionalRangeFormula不匹配,并且公式中的行与代码中指定的行不匹配。 有关更多信息,请参阅下面的“详细信息”部分。

假设:
注1:
我注意到,在一个范围内,Excel将自动“拟合”一个条件格式公式,以匹配每个单元格在一个范围内的细节。 例如,在列A中的随机数在1到10之间的工作表中:

  1. 我selectA列
  2. 我添加一个条件格式列A,公式“= IF(A1 = 2,1)”。 如果此公式为真,单元格字体将被格式化为红色。
  3. 包含“2”的列A中的每个单元格都将显示为红色, 而不仅仅是单元格A1 ,即使该公式仅适用于A1。

是否有可能在上面的代码中,Excel正在做我的公式的一些改变,试图“猜测”公式应该是什么?

笔记2:
我不认为这是一个范围使用太多的条件格式的结果。 在微软的“FormatConditions.Add方法”的Excel 开发人员笔记中 ,有一句话:“你不能为一个范围定义三个以上的条件格式”。 不过,我已经成功添加了三个以上的条件格式,没有任何更改(请参阅下面的详细信息)。 此外,我testing了所有其他条件格式注释(无效),以便只有一个条件格式应用,没有任何更改。

细节:
我在Win7机器上使用Excel 2007。

我的代码比上面假设中给出的例子稍微复杂一些。

条件格式函数用于检查“AP”列中的单元格是否为空,然后应用红色轮廓。

如果我With conditionalRange.FormatConditions _.add(xlExpression, , ConditionalRangeFormula)行放置一个断点,我可以确认ConditionalRangeFormula是否正确(“= ISBLANK($ AP1)”)。 但是,运行后,指定范围内每个单元格的条件格式公式 “= ISBLANK($ AP2)”。 这是我的代码指定的。

请注意,工作范围( ConditionalRange是下面的代码)实际上从列AP的第2行开始,因为第1行是标题行。 作为一个有趣的笔记,如果我使ConditionalRangeFormula “= ISBLANK($ AP2)”,指定范围内的每个单元格的条件格式公式为“= ISBLANK($ AP3)”。 请注意公式中的行是如何硬编码的,正如前一段所述的第一种情况一样。 有趣的行为,但我找不到这个文件。

此外,请注意有四个With … End With应用条件格式化到该单元格,在出现问题的条件格式之前应用。 前四个语句中的每一个都使用按预期工作的公式,所以我简化了这些代码块,使整个代码更容易遵循。 有关更多详细信息,请参阅上面“假设”部分下的“注2”。

代码大纲如下:

 'define string to identify workbook Dim w2 As String w2 = "myworksheet.xlsx" 'define ws2 as worksheet to work on Dim ws2 As Worksheet: Set ws2 = Workbooks(w2).Worksheets(1) 'define working range Dim ws2r As range Set ws2r = ws2.range("E2", ws2.range("E2").End(xlDown)) 'add conditional formatting to the working range With ws2 'see below for .colDiff function Set ConditionalRange = ws2r.Offset(0, colDiff("E", "AP")) 'The following 4 With...End With statements assign other 'conditional formats, none of which have problems. 'I've simplified these statements to outline what's being done. 'See the last (5th) With...End With statement for 'the unexpected behavior. WithConditionalRange.FormatConditions _ .add(xlExpression, , ADifferentFormula1) .Font.Color = someRGBValue End With WithConditionalRange.FormatConditions _ .add(xlExpression, , ADifferentFormula2) .Font.Color = someRGBValue End With WithConditionalRange.FormatConditions _ .add(xlExpression, , ADifferentFormula3) .Font.Color = someRGBValue End With WithConditionalRange.FormatConditions _ .add(xlExpression, , ADifferentFormula4) .Font.Color = someRGBValue End With 'This With...End With block has unexpected behavior. ConditionalRangeFormula = "=ISBLANK($AP1)" With ConditionalRange.FormatConditions _ .add(xlExpression, , ConditionalRangeFormula) .Borders.color = RGB(192, 0, 0) End With End With 'with ws2 

这里是上述过程中调用的“colDiff”函数:

 Public Function colDiff(col1 As String, col2 As String) As Long With ActiveSheet 'return the number of columns between col1 and col2 colDiff = Abs(.range(col1 & "1").Column - .range(col2 & "1").Column) End With End Function 

我通过在AP1中放置一个标题“Data”来testing这个function,将随机数据从AP2放到AP16,然后删除AP1,5,7,13,使得BLANKS和以下工作正常:

 Public Sub Test() With Range("E2:AP16").FormatConditions.Add(xlExpression, , "=ISBLANK($AP2)") .Borders.Color = RGB(192, 0, 0) End With End Sub 

上述单一function是否适合您? 如果没有,我会怀疑也许有合并的单元格或其他电子表格特定的问题正在进行。