2012-11-13 37 views
0

我想在Excel中使用VBA将条件格式添加到数据透视表的列中。问题是无论何时刷新数据透视表或更改过滤器等,条件格式都会丢失。我的解决方案是在工作簿中的数据透视表更新事件中添加一个宏,该工作簿很有效。看来,当我运行创建数据透视表的代码并添加处理条件格式的代码时,会发生错误,但只有在VBA窗口未打开时才会发生。如果VBA窗口打开,代码将正常执行 - 尽管没有代码更改或引用更改。通过VBA将代码添加到工作簿时出错

Private Sub setupConditionalFormattingForStatusColumn() 
    Dim thisSheetModule As vbcomponent 
    Dim formattingCodeString As String 

    On Error GoTo conditionalFormattingError 

    formattingCodeString = _ 
    "Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)" & vbNewLine & _ 
    " With Target.parent.Columns(" & harReportColumn("Status") & ")" & vbNewLine & _ 
    "   .FormatConditions.AddIconSetCondition" & vbNewLine & _ 
    "   .FormatConditions(.FormatConditions.Count).SetFirstPriority" & vbNewLine & _ 
    vbNewLine & _ 
    "   With .FormatConditions(1)" & vbNewLine & _ 
    "    .IconSet = ActiveWorkbook.IconSets(xl4TrafficLights)" & vbNewLine & _ 
    "    .IconCriteria(1).Icon = xlIconYellowExclamation" & vbNewLine & _ 
    vbNewLine & _ 
    "    With .IconCriteria(2) " & vbNewLine & _ 
    "     .Type = xlConditionValueNumber" & vbNewLine & _ 
    "     .value = -1" & vbNewLine & _ 
    "     .Operator = 5" & vbNewLine & _ 
    "     .Icon = xlIconGreenCircle" & vbNewLine & _ 
    "    End With" & vbNewLine & _ 
    vbNewLine & _ 
    "    With .IconCriteria(3)" & vbNewLine & _ 
    "     .Type = xlConditionValueNumber" & vbNewLine & _ 
    "     .value = 1.05" & vbNewLine & _ 
    "     .Operator = 7" & vbNewLine & _ 
    "     .Icon = xlIconYellowCircle" & vbNewLine & _ 
    "    End With" & vbNewLine 
    formattingCodeString = formattingCodeString & vbNewLine & _ 
    "    With .IconCriteria(4)" & vbNewLine & _ 
    "     .Type = xlConditionValueNumber" & vbNewLine & _ 
    "     .value = 1.15" & vbNewLine & _ 
    "     .Operator = 7" & vbNewLine & _ 
    "     .Icon = xlIconRedCircleWithBorder" & vbNewLine & _ 
    "    End With" & vbNewLine & _ 
    vbNewLine & _ 
    "    .ShowIconOnly = True" & vbNewLine & _ 
    "   End With" & vbNewLine & _ 
    vbNewLine & _ 
    "   .HorizontalAlignment = xlCenter" & vbNewLine & _ 
    "   .VerticalAlignment = xlCenter" & vbNewLine & _ 
    "  End With" & vbNewLine & _ 
    "End Sub" 

    Set thisSheetModule = ThisWorkbook.VBProject.VBComponents(harReportSheet.CodeName) 
    thisSheetModule.CodeModule.AddFromString formattingCodeString 

    Exit Sub 

conditionalFormattingError: 
    errorLog.logError "WARNING: An error occured while applying the conditional formatting code for the ""Status"" column." 
    Err.Clear 
    Resume Next 
End Sub 

产生错误的行是:thisSheetModule.CodeModule.AddFromString formattingCodeString,但如果是关闭的VBA窗口仅产生的错误。

任何想法?

+7

你得到了什么错误信息? –

+0

谢谢@KevinPope没有明确的错误消息可用,因为错误不是/完全不在VBA代码的范围内。但请参阅下面的答案,了解我的工作。 – Billy

回答

0

所以我找到了这个问题的答案。很显然,当VBA窗口未打开时(这是为什么超出我的原因),只有当它重新编译时,Excel才能正确初始化新创建的工作表的代码名属性。解决方法是在对代码名属性进行任何调用之前强制Excel重新编译。这为我工作的解决方案是将下面的代码:

On Error Resume Next 
Application.VBE.CommandBars.ActiveMenuBar.FindControl(ID:=578).Execute 
On Error GoTo conditionalFormattingError 

Set thisSheetModule = ...开头的行上方。奇怪的是,强制执行重新编译的代码行也给我带来了一个错误,我可以安全地忽略这个错误,并且处理周围的错误。

更多信息可以在这里找到:http://www.office-archive.com/2-excel/d334bf65aeafc392.htm

希望帮助别人那里。 :-)

相关问题