0

Excel で 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 ウィンドウが閉じられている場合にのみ生成されます。

何か案は?

4

1 に答える 1

0

そのため、この問題に対する答えを見つけることができました。明らかに、VBA ウィンドウが開いていない場合 (理由はわかりません)、Excel は新しく作成されたワークシートの codename プロパティを適切に初期化せず、再コンパイルした場合にのみ初期化します。回避策は、codename プロパティを呼び出す前に 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 を参照してください。

それが誰かを助けることを願っています。:-)

于 2012-11-15T18:31:42.783 に答える