Excel VBA条件格式自动更改

时间:2014-04-28 15:50:06

标签: excel vba excel-vba

问题:
是否有任何会导致 FormatConditions.Add 方法的 Formula1 参数自动更改,或者从Excel-VBA宏中的硬编码更改?<登记/> 如果是这样,这种行为的文档在哪里?

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

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

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

  1. 我选择了A栏。
  2. 我将一个条件格式添加到A列,公式为“= IF(A1 = 2,1)”。如果此公式为真,则单元格字体将以粗体红色格式化。
  3. A列中包含“2”的每个单元格都是粗体红色,不仅仅是单元格A1 ,即使公式仅适用于A1。
  4. 在后台Excel中是否可能在上面的代码中更改了我的公式,试图“猜测”公式应该是什么?

    注2:
    我认为这不是为范围使用太多条件格式的结果。在Microsoft的Excel developer notes for "FormatConditions.Add Method"中,有一句话“你不能为一个范围定义三种以上的条件格式”。但是,我已成功添加了三种以上的条件格式而没有任何更改(请参阅下面的详细信息)。此外,我已经测试了所有其他条件格式注释掉(停用),因此只应用了一种条件格式,没有任何更改。

    详细信息:
    我在Win7机器上使用Excel 2007。

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

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

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

    请注意,工作范围( ConditionalRange 是以下代码)实际上从列AP的第2行开始,因为第1行是标题行。有趣的是,如果我使 ConditionalRangeFormula “= ISBLANK($ AP2)”,则指定范围内每个单元格的条件格式化公式为“= ISBLANK($ AP3)”。注意公式中的行是如何从硬编码的+1开始,就像在前一段中描述的第一种情况一样。有趣的行为,但我无法找到相关的文档。

    另外,请注意,在应用出现问题的条件格式之前,有四个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
    

1 个答案:

答案 0 :(得分:0)

我通过放置标题&#34;数据&#34;来测试此功能。在AP1中,将随机数据从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

上述单一功能是否适合您?如果没有,我怀疑可能存在合并的单元格或其他一些电子表格特定的问题。