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之间的工作表中:
我不认为这是对一个范围使用太多条件格式的结果。在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文档,但这里有几个网站的例子可以帮助理解条件格式的寻址是如何工作的:和