我正在尝试使用VBA在类似范围内进行条件格式化。我确信我的代码中的错误与优先级有关,但我无法弄清楚它是什么。我试图格式化基本上相同的单元格组。如果列CI包含文本" TIES MATERIAL"然后它应该格式化单元格,在下面的情况下列CU:DD,到该特定行的颜色白色。如果该列不包含文本字符串且值已从其原始值更改,则单元格应更改为红色。
以下是我将其设为白色的代码:
Private Sub white_format()
'This section adds the formatting condition of white cells to the cells that are changed by the PEMCON
ActiveWorkbook.Sheets("Material").Activate
Dim lRow As Integer
Dim lCol As Integer
lRow = ActiveWorkbook.Sheets("Material").Range("A2").End(xlDown).Row
lCol = ActiveWorkbook.Sheets("Material").Range("A2").End(xlToRight).Column
firstCell = ActiveWorkbook.Sheets("Material").Range("CU3").Address(False, False)
lastCell = ActiveWorkbook.Sheets("Material").Cells(lRow, lCol).Address(False, False)
Debug.Print "firstCell: " & firstCell
Debug.Print "lastHeaderCell: " & lastHeaderCell
Debug.Print "colCount: " & colCount
'Defines the array of the CU3 to the last used cell and it checks to see if the coorisponding cell in column CI has TIES MATERIAL in it
ActiveWorkbook.Sheets("Material").Range(firstCell, lastCell).FormatConditions.Add Type:=xlExpression, Formula1:="=$CI3=""TIES MATERIAL"""
ActiveWorkbook.Sheets("Material").Range(firstCell, lastCell).FormatConditions(1).SetFirstPriority
With ActiveWorkbook.Sheets("Material").Range(firstCell, lastCell).FormatConditions(1).Interior
.PatternColorIndex = xlAutomatic
.Color = 16777215 'this is the color white
.TintAndShade = 0
End With
ActiveWorkbook.Sheets("Material").Range(firstCell, lastCell).FormatConditions(1).StopIfTrue = True
End Sub
以下是我将其设为红色的代码:
Private Sub Red_Format()
Dim lRow As Integer
Dim lCol As Integer
lRow = ActiveWorkbook.Sheets("Material").Range("A2").End(xlDown).Row
lCol = ActiveWorkbook.Sheets("Material").Range("A2").End(xlToRight).Column
firstCell = ActiveWorkbook.Sheets("Material").Range("CU2").Address(False, False)
lastCell = ActiveWorkbook.Sheets("Material").Cells(lRow, lCol).Address(False, False)
formatRange = ActiveWorkbook.Sheets("Material").Range(firstCell, lastCell)
lastHeaderCell = ActiveWorkbook.Sheets("Material").Cells(2, lCol).Address(False, False)
colCount = ActiveWorkbook.Sheets("Material").Range(firstCell, lastHeaderCell).Columns.Count
'Defines the array of the CU2 to the last used cell and adds the formatting to turn it red if it has been altered.
ActiveWorkbook.Sheets("Material").Range(firstCell, lastCell).FormatConditions.Add Type:=xlExpression, Formula1:="=OFFSET($A$1,ROW()-1,COLUMN()-1)<>OFFSET($A$1,ROW()-1,COLUMN()+" & colCount & ")"
'ActiveWorkbook.Sheets("Material").Range(firstCell, lastCell).FormatConditions(1).SetFirstPriority
With ActiveWorkbook.Sheets("Material").Range(firstCell, lastCell).FormatConditions(1).Interior
.PatternColorIndex = xlAutomatic
.Color = 255
.TintAndShade = 0
End With
ActiveWorkbook.Sheets("Material").Range(firstCell, lastCell).FormatConditions(1).StopIfTrue = False
End Sub
以下是我调用white_format
然后在同一子例程中调用red_format
时条件格式的样子。
公式显示正确,但颜色位于他们需要的相反部分。我做错了什么?我也知道我的代码不是最有效的。我怎么能重写呢?
答案 0 :(得分:3)
Formula1:="=$CI3=""TIES MATERIAL"""
&#34;如果列CI包含文本&#34; TIES MATERIAL&#34;那么它应该将单元格格式化为白色&#34;
为此,您的格式条件应为:
Formula1:="=ISNUMBER(SEARCH(""TIES MATERIAL"", $CI" & firstCell.Row & "))"
至于第二个条件,我仍然没有得到你想要实现的想法。然而,公式可能是正确的,但问题是你错误地提到它:
With ActiveWorkbook.Sheets("Material").Range(firstCell, lastCell).FormatConditions(1).Interior
由于这是第二个 FormatCondition
,您应该将其称为索引(2)
。这解释了为什么你实际上用红色覆盖第一个条件的格式,而第二个条件没有格式化。
With ActiveWorkbook.Sheets("Material").Range(firstCell, lastCell).FormatConditions(2).Interior
' ^^^
(假设您的CF都适用于相同的范围)。如果没有,通常安全的方法是直接在CF上获得参考并使用它:
With myRange.formatConditions.Add(xlExpression, formula1)
.Interior.ColorIndex = ...
. etc...
End With
答案 1 :(得分:3)
公式显示正确,但颜色位于它们需要的相反部分。
这不完全正确。您创建一个白色背景的CFR并将其设置为列表的顶部。然后创建第二个但在将其放到列表顶部之前,将列表CFR的顶部更改为红色背景。所以你有一个曾经是白色背景的CFR,现在是红色背景和第二个没有背景的CFR。
我将假设红色CFR的公式是正确的。其他人提出了一个非易变的变化。
Option Explicit
Private Sub white_red_CFRs()
'This section adds the formatting condition of white cells to the cells that are changed by the PEMCON
Dim lRow As Long, lCol As Long, firstCell As String, lastCell As String
Dim colCount As Long, lastHeaderCell As Long
With ActiveWorkbook.Worksheets("Material")
lRow = .Range("A2").End(xlDown).Row
lCol = .Range("A2").End(xlToRight).Column
firstCell = .Range("CU3").Address(False, False)
lastCell = .Cells(lRow, lCol).Address(False, False)
With .Range(firstCell, lastCell)
.FormatConditions.Delete
With .FormatConditions.Add(Type:=xlExpression, Formula1:="=$CI3=""TIES MATERIAL""")
.Interior.Color = 16777215 'this is the color white
.SetFirstPriority
.StopIfTrue = True
End With
With .FormatConditions.Add(Type:=xlExpression, Formula1:="=OFFSET($A$1,ROW()-1,COLUMN()-1)<>OFFSET($A$1,ROW()-1,COLUMN()+" & colCount & ")")
.Interior.Color = 255 'this is the color red
.StopIfTrue = True
End With
End With
End With
End Sub
当您记录CFR时,将您的操作转换为代码的Excel的一部分不知道已经存在多少CFR,因此它使每个CFR成为第一个,因此它可以继续配置并将新CFR称为{{ 1}}。在将第二个CFR设置为最高(1)CFR之前,您将格式配置设置为.FormatConditions(1)
。我更喜欢使用With .Add方法。
答案 2 :(得分:2)
行。同样有点难以理解你试图实现什么以及出了什么问题,因为你没有给出任何测试材料(而且这些列是在右边,我必须使它更简单...),但它可能只是我
当列CI读取TIES MATERIAL时,要将单元格颜色格式化为白色,您的规则公式“= $ CI3 =”“TIES MATERIAL”“”工作正常,但我只是想知道当它们不是白色时它们会是什么颜色?由于其他规则,它们会变红吗?然后它们的顺序错误,因为冲突规则会使列表中的规则更高。 “如果为真,则停止”适用于2007年之前的Excel版本。
并且可以看到图像中的错误,它来自您的代码:在“管理规则”对话框图像中,您会看到“白色规则”被标记为“无格式设置”。那是因为您在两个过程中都引用了FormatConditions(1)。如果你先运行'白色规则'和'红色',后者已设置好,但同时打破了第一个(第一个),因为对范围的引用不匹配。
所以也许你想先创建'白色规则'并在创建'红色'时参考FormatConditions(2),但正如我所说的那样。 : - )