Excel 2013-VBA-创建&;时出现运行时错误9;访问[超过4!]个条件格式项目

Excel 2013-VBA-创建&;时出现运行时错误9;访问[超过4!]个条件格式项目,vba,excel,Vba,Excel,我搜索了又搜索,没有找到解决方案,也无法解释发生了什么 基本上,我在Excel 2013中有一个工作表,每行有一个发票数据选择。工作表上有8种不同范围的条件格式 当使用此方法将行[在范围顶部]插入到范围中时: Manager.Select Manager.Range("headerRow").Offset(1, 0).Range("a1:M1").Select Selection.Copy Selection.Insert Shift:=xlDown 条件格式变

我搜索了又搜索,没有找到解决方案,也无法解释发生了什么

基本上,我在Excel 2013中有一个工作表,每行有一个发票数据选择。工作表上有8种不同范围的条件格式

当使用此方法将行[在范围顶部]插入到范围中时:

    Manager.Select
    Manager.Range("headerRow").Offset(1, 0).Range("a1:M1").Select
    Selection.Copy
    Selection.Insert Shift:=xlDown
条件格式变得复杂、混乱、支离破碎,最终几个月后变得如此混乱,似乎无法正常工作

在各种方法上浪费了几个小时之后,我的解决方案很简单。(当然!)当一行插入到范围的顶部时,我想使用VBA清除并重置8 x条件格式-本质上是执行快速清理-删除工作表上的所有条件格式,并重新应用8个具有正确范围和格式的条件格式,用于整个范围(从上到下)

问题是,在使用.FormatConditions.Add和.FormatConditions(x)添加和格式化4种条件格式后,当我尝试格式化第5项字体或背景色时,它会抛出一个下标错误。我已经搜索了一个解释,并理解基本上我可以添加任意数量的CF,所以发生了什么

疯狂的是,它似乎一次又一次正常工作,然后再也不会正常工作了

这是我的测试代码,它在五级方程式之前都运行良好

Sub CFReset()

' Get top and bottom of Invoices
TopRow = (Manager.Range("headerRow").Row) + 1
BottomRow = ActiveSheet.UsedRange.Rows.Count

' Clear All Current Conditional Formatting on Manager Sheet between Invoice Top Row and Invocie Bottom Row
Range("A" & TopRow & ":L" & BottomRow).FormatConditions.Delete

'CD Formula 1 - 'Formula:  =AND(I17="Paid",G17<>0) - 'Colour: Red on White Background 'Applies to: =$G$17:$G$49
With ActiveSheet.Range("$G$" & TopRow & ":$G$" & BottomRow)
    .FormatConditions.Add Type:=xlExpression, Formula1:="=AND(I" & TopRow & "=""Paid"",G" & TopRow & "<>0)"
    .FormatConditions(1).Font.ColorIndex = 3 ' Red
End With

'CD Formula 2 - '=AND(I17="Partial",F17<>0) 'Colour: Red on white background 'Applies to: =$G$17:$G$49
With ActiveSheet.Range("$G$" & TopRow & ":$G$" & BottomRow)
    .FormatConditions.Add Type:=xlExpression, Formula1:="=AND(I" & TopRow & "=""Partial"",F" & TopRow & "<>0)"
    .FormatConditions(2).Font.ColorIndex = 3 ' Red
End With

'CD Formula 3 '=OR($I17="Void") - Text Colour RGB: 255,179,179 'Applies to: =$A$17:$I$49
With ActiveSheet.Range("$A$" & TopRow & ":$I$" & BottomRow)
    .FormatConditions.Add Type:=xlExpression, Formula1:="=OR($I" & TopRow & "=""Void"")"
    .FormatConditions(3).Font.Color = RGB(255, 179, 179) ' Pinkish
End With

'CD Formula 4 - '=OR($I17="Paid",$I17="Closed") - Text Colour: RGB 192, 192, 192 'Applies to: =$A$17:$I$49
With ActiveSheet.Range("$A$" & TopRow & ":$I$" & BottomRow)
    .FormatConditions.Add Type:=xlExpression, Formula1:="=OR($I" & TopRow & "=""Paid"",$I" & TopRow & "=""Closed"")"
    .FormatConditions(4).Font.Color = RGB(192, 192, 192) ' Gray
End With

'CD Formula 5 '=AND(I17="Paid",G17<>0) 'Color: RGB 0, 0, 0 'Black 'Background Colour:RGB: 255,255,204 ' Light Yellow 'Applies to: =$F$17:$F$49
With ActiveSheet.Range("$F$" & TopRow & ":$F$" & BottomRow)
    .FormatConditions.Add Type:=xlExpression, Formula1:="=AND(I" & TopRow & "=""Paid"",G" & TopRow & "<>0)"
    .FormatConditions(5).Font.ColorIndex = 1 ' Black
    .FormatConditions(5).Interior.Color = RGB(255, 255, 204) ' Light Yellow
End With

'CD Formula 6  '=AND(I17="Partial",F17=0) 'Color: RGB 0, 0, 0 'Black 'Background Colour:RGB: 255,255,204 ' Light Yellow 'Applies to: =$F$17:$F$49
With ActiveSheet.Range("$F$" & TopRow & ":$F$" & BottomRow)
    .FormatConditions.Add Type:=xlExpression, Formula1:="=AND(I" & TopRow & "=""Partial"",F" & TopRow & "=0)"
    .FormatConditions(6).Font.ColorIndex = 1 ' Black
    .FormatConditions(6).Interior.Color = RGB(255, 255, 204) ' Light Yellow
End With


'CD Formula 7 '=AND(G17>0,AND(D17<TODAY(),D17<>"")) 'Colour: Red 'Background Colour:RGB: 255,255,204 ' Light Yellow 'Applies to: =$D$17:$D$49
With ActiveSheet.Range("$D$" & TopRow & ":$D$" & BottomRow)
    .FormatConditions.Add Type:=xlExpression, Formula1:="=AND(G" & TopRow & ">0,AND(D" & TopRow & "<TODAY(),D" & TopRow & "<>""""))"
    .FormatConditions(7).Font.ColorIndex = 3 ' Red
    .FormatConditions(7).Interior.Color = RGB(255, 255, 204) ' Light Yellow
End With


'CD Formula 8 '=COUNTIF($B:$B,B17)>1 'Color: RGB 255,255,255 -'White 'Background Colour: Red ' Rgb 255 ' Applies to: =$B$17:$B$49
With ActiveSheet.Range("$B$" & TopRow & ":$B$" & BottomRow)
    .FormatConditions.Add Type:=xlExpression, Formula1:="=COUNTIF($B:$B,B" & TopRow & ")>1"
    .FormatConditions(8).Font.ColorIndex = 2 ' White
    .FormatConditions(8).Interior.ColorIndex = 3 ' Red
End With


End Sub

我已经包含了我的备注,这些备注是我对每种格式的注释-这些实际上来自我的原始CF。

每个
FormatConditions
集合都与您指定的范围相关,而不是与整个工作表相关。您的条件格式#5正在中断,因为它只适用于F列的一部分,并且只有两个预设置已定义的CFs包括F列的该部分。如果将引用从
.FormatConditions(5)
更改为
.FormatConditions(3)
,则它应该可以工作


CFs#1和#2仅适用于G列的一部分,而CFs#3和#4适用于A:I列的一部分。因此,当您尝试将CF#5添加到F列的一部分时,集合中只有两个以前的CFs。若要解决此问题,CF#5应使用索引3,CF#6应使用索引4,CF#7应使用索引3,而CF#8应使用索引3

如果您隐藏了第2行和第2行使用CF规则“应用于”启动第3行上的所有数据输入:从第2行开始,在第3行插入新行(向下推)是否会自动神奇地调整应用于?一个注释和一个建议。请注意,添加新CF条件时,它会变为
FormatConditions(1)
。我认为您正在一次又一次地有效地修改同一个。我还建议您查看
.FormatConditions.ModifyAppliesToRange
方法。这允许您调整FormatCondition应用的范围。(我想这很明显!)@Jeeped Yes你的建议在理论上很好,但是它需要在其他地方修改许多行代码,所以不是真正的选项。@Doug-每个CF都有不同的格式和不同的范围,基于不同的条件,并且由于添加行等会弄脏存储的CF,我认为清除它们然后重新设置是非常容易的应用。我只是不明白为什么上面的编码不工作并返回错误?有人知道为什么它会进入CF项目5然后出错吗?这一点真的让我抓狂。我理解你的问题。你理解我的观点吗?你的回答没有表明你是否理解。祝你好运!或者,你可以只做
.FormatConditions(.FormatConditions.Count)
,这将是灵活的。+1谢谢道格!你是对的!在对Excel先生进行了一些指导之后,我重新安排了CF,并将全局CF放在其他CF之前。我还被指示使用.FormatConditions.Count,如果CF索引#-由于AlphaFrog,它第一次工作得很好!请参阅此处:非常感谢您的努力!我很高兴很高兴我们终于到了那里
'Attempt2
With ActiveSheet.Range("$A$" & TopRow & ":$I$" & BottomRow).FormatConditions
    .Add Type:=xlExpression, Formula1:="=OR($I" & TopRow & "=""Void"")"
    With .Item(3).Font
        .Color = RGB(255, 179, 179) ' Pinkish
    End With
End With