Excel VBA条件格式自动更改

Excel VBA条件格式自动更改,vba,excel,Vba,Excel,问题: 是否有任何因素会导致FormatConditions.Add方法的Formula1参数自动更改,或更改Excel VBA宏中硬编码的参数? 如果是这样,这种行为的文档在哪里 问题描述: 将FormatConditions.Add方法应用于范围时,公式与代码中指定的不匹配 我的宏代码将公式分配给名为ConditionalRangeFormula的变量。运行宏后,实际的条件格式公式与ConditionalRangeFormula不匹配,并且公式中的行与代码中指定的行不匹配。有关更多信息,请参

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

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

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

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

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

    注2:
    我不认为这是对一个范围使用太多条件格式的结果。在Microsoft的Excel中,有一句话是“您不能为一个范围定义三种以上的条件格式”。但是,我已经成功地添加了三种以上的条件格式,并且没有任何更改(请参见下面的详细信息)。此外,我还测试了注释掉的所有其他条件格式(未激活),因此只应用了一种条件格式,没有任何更改

    详细信息:
    我正在Win7机器上使用Excel2007

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

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

    如果我在带有conditionalRange.FormatConditions\uxExpression,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
    

    我通过在AP1中放置一个标题“Data”,将AP2中的随机数据放置到AP16中,然后删除AP1、5、7、13以生成空格来测试此功能,以下操作正确:

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

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

    谢谢您的输入。是的,你的例子对我很有用,但不幸的是,它不能解释眼前的问题。问题基本上是,为什么电子表格显示上述行为?但是,对于您的答案,有两个想法:第一,(这并不明显)我只处理一个列,而不是您的示例中的多个列。第二,我的工作表中没有合并的单元格。@Arontomas抱歉,我误读了示例代码-我以为colDiff是用来扩大范围的,而不是抵消范围。有趣的是,以直接值显式编写内容是可行的,但通过变量隐式编写则不行:(@aarontomas正如您所知,Excel用于应用条件格式的“魔力”是基于相对寻址的。在您将公式键入目标范围的第一个单元格时,Excel会应用该公式,
    =ISBLANK($AP1)
    。然后它偏移公式以将其应用于范围内的其余单元格。因此,由于
    AP3
    AP2
    (第一个单元格)低一行,因此公式变为
    =ISBLANK($AP2)
    。如果出于某种原因,您对多个列应用了条件格式,$AP将保持不变,因为您使用了$anchor。这是有道理的,并且符合上面的注释1。是否有相关文档?FormatConditions对象的文档没有提到太多,很遗憾。@AaronThomas表示同意,虽然找不到太多的官方MS文档,但这里有几个网站的例子可以帮助理解条件格式的寻址是如何工作的:和