2017-02-16 9 views
1

参照リストから複数のピボットテーブルを1つのシートにフィルタリングしようとしていますが、最初のWith文(CampaignAnalysis)エラー(MailCount)を返します。これに関する助けは素晴らしいでしょう!ありがとう!Excel/VB:1つの値リストを使用して複数のピボットテーブルをフィルタリングする

Sub Test() 
Dim PI As PivotItem 
With Worksheets("In Focus - Campaign Analysis").PivotTables("CampaignAnalysis").PivotFields("Campaign Code") 
.ClearAllFilters 
For Each PI In .PivotItems 
PI.Visible = WorksheetFunction.CountIf(Range("CA_Range1"), PI.Name) > 0 
Next PI 
End With 

Dim MC As PivotItem 
With Worksheets("In Focus - Campaign Analysis").PivotTables("MailCount").PivotFields("MailCount_CC") 
.ClearAllFilters 
For Each MC In .PivotItems 
MC.Visible = WorksheetFunction.CountIf(Range("CA_Range1"), MC.Name) > 0 
Next MC 
End With 
End Sub 
+0

このフィルタを使用して少なくとも1つのMCが表示されていることを確認してください。何が起こっているかは、コードがリスト内の最後の項目を隠そうとしたときにエラーが発生する場合です。自分でコードを実行することなく、これは私の最高の推測です。 –

+0

フィードバックBrandonに感謝します。私はそれが働くように管理したので、私は洞察に感謝する。現時点で問題となっているのは、1つのピボットテーブルで2つのフィールドを更新しようとしていることです。 2つのフィールドは範囲(動作する)ですが、2番目のフィールドは別の計算セルに参照する日付です –

+0

ここでは、 "ReportDate"と呼ばれる "Segment"にPivotFieldsがあり、計算された日付を参照しようとしていますこのシート上のセルA1が、コードを動作させることはできません。 2番目のPivotFieldをコードにどのように統合すればよいですか? –

答えて

0
Sub Test() 

Application.ScreenUpdating = False 
Application.Calculation = xlCalculationManual 
Application.EnableEvents = False 
ActiveSheet.DisplayPageBreaks = False 
Application.DisplayStatusBar = False 
Application.DisplayAlerts = False 

Dim PI As PivotItem 
With ActiveSheet.PivotTables("CampaignAnalysis").PivotFields("Campaign Code") 
.ClearAllFilters 
    For Each PI In .PivotItems 
     PI.Visible = WorksheetFunction.CountIf(Range("CA_Range1"), PI.Name) > 0 
    Next PI 

With ActiveSheet.PivotTables("MailCount").PivotFields("Campaign Code") 
.ClearAllFilters 
    For Each MC In .PivotItems 
     MC.Visible = WorksheetFunction.CountIf(Range("CA_Range1"), MC.Name) > 0 
    Next MC 

With ActiveSheet.PivotTables("AgeRange").PivotFields("Campaign Code") 
.ClearAllFilters 
    For Each AR In .PivotItems 
     AR.Visible = WorksheetFunction.CountIf(Range("CA_Range1"), AR.Name) > 0 
    Next AR 

With ActiveSheet.PivotTables("DrivablePort").PivotFields("Campaign Code") 
.ClearAllFilters 
    For Each DP In .PivotItems 
     DP.Visible = WorksheetFunction.CountIf(Range("CA_Range1"), DP.Name) > 0 
    Next DP 

With ActiveSheet.PivotTables("CruiseName").PivotFields("Campaign Code") 
.ClearAllFilters 
    For Each CN In .PivotItems 
     CN.Visible = WorksheetFunction.CountIf(Range("CA_Range1"), CN.Name) > 0 
    Next CN 

With ActiveSheet.PivotTables("CampaignName").PivotFields("Campaign Code") 
.ClearAllFilters 
    For Each CN2 In .PivotItems 
     CN2.Visible = WorksheetFunction.CountIf(Range("CA_Range1"), CN2.Name) > 0 
    Next CN2 

With ActiveSheet.PivotTables("Itinerary").PivotFields("Campaign Code") 
.ClearAllFilters 
    For Each IT In .PivotItems 
     IT.Visible = WorksheetFunction.CountIf(Range("CA_Range1"), IT.Name) > 0 
    Next IT 

With ActiveSheet.PivotTables("Segment").PivotFields("Campaign Code") 
.ClearAllFilters 
    For Each SG In .PivotItems 
     SG.Visible = WorksheetFunction.CountIf(Range("CA_Range1"), SG.Name) > 0 
    Next SG 

**-- so I would like the ActiveSheet.PivotTables("Segment").PivotFields("ReportDate") to equal a referencing calculated date cell on the same sheet e.g. cell Z4 = 12/02/2017** 

End With 
End With 
End With 
End With 
End With 
End With 
End With 
End With 

Application.ScreenUpdating = True 
Application.Calculation = xlCalculationAutomatic 
Application.EnableEvents = True 
ActiveSheet.DisplayPageBreaks = False 
Application.DisplayStatusBar = True 
Application.DisplayAlerts = True 

End Sub 
+0

上記のコードもまたすべてのピボットテーブルを実行します。複数のピボットテーブルをより効率的にフィルタリングする方法をご存知ですか? –

0

まず第一に、このようなあなたのコードをリファクタリングすることができます。そうすることで、デバッグが容易になります。

Sub Test() 

Application.ScreenUpdating = False 
Application.Calculation = xlCalculationManual 
Application.EnableEvents = False 
ActiveSheet.DisplayPageBreaks = False 
Application.DisplayStatusBar = False 
Application.DisplayAlerts = False 

Dim pi as PivotItem 
Dim pt as PivotTable 
Dim ws as Worksheet 

Set ws = ActiveSheet ' It is best not to use activesheet and to instead 
        ' go through "ThisWorkbook.Sheets("") or something similar. 


' This loop will allow us to prevent pivot tables from updating automatically 
' Doing this should speed up your code dramatically. 
For each pt in ws.PivotTables 
    pt.ManualUpdate = True 
Next 


With ws.PivotTables("CampaignAnalysis").PivotFields("Campaign Code") 
    .ClearAllFilters 
    ' This loop right here is going to cause an issue. If there is ever an instance 
    ' where all pivotitems would be hidden by this loop, then you will encounter an error. 
    ' It is best to set at least one item visible, and then loop through the items to set 
    ' the other items to hidden. 

    For Each pi In .PivotItems 
     .Visible = WorksheetFunction.CountIf(ws.Range("CA_Range1"), pi.Name) > 0 
    Next 
End With 

With ws.PivotTables("MailCount").PivotFields("Campaign Code") 
    .ClearAllFilters 
    For Each pi In .PivotItems 
     pi.Visible = WorksheetFunction.CountIf(ws.Range("CA_Range1"), pi.Name) > 0 
    Next 
End With 

With ws.PivotTables("AgeRange").PivotFields("Campaign Code") 
    .ClearAllFilters 

    For Each pi In .PivotItems 
     pi.Visible = WorksheetFunction.CountIf(ws.Range("CA_Range1"), pi.Name) > 0 
    Next 
End With 

With ws.PivotTables("DrivablePort").PivotFields("Campaign Code") 
    .ClearAllFilters 

    For Each pi In .PivotItems 
     pt.Visible = WorksheetFunction.CountIf(ws.Range("CA_Range1"), pi.Name) > 0 
    Next 
End With 

With ws.PivotTables("CruiseName").PivotFields("Campaign Code") 
    .ClearAllFilters 

    For Each pi In .PivotItems 
     pi.Visible = WorksheetFunction.CountIf(ws.Range("CA_Range1"), pi.Name) > 0 
    Next 
End With 

With ws.PivotTables("CampaignName").PivotFields("Campaign Code") 
    .ClearAllFilters 

    For Each pi In .PivotItems 
     pi.Visible = WorksheetFunction.CountIf(ws.Range("CA_Range1"), pi.Name) > 0 
    Next 
End With 

With ws.PivotTables("Itinerary").PivotFields("Campaign Code") 
    .ClearAllFilters 

    For Each pi In .PivotItems 
     pi.Visible = WorksheetFunction.CountIf(ws.Range("CA_Range1"), pi.Name) > 0 
    Next pi 
End With 

With ws.PivotTables("Segment").PivotFields("Campaign Code") 
    .ClearAllFilters 

    For Each pi In .PivotItems 
     pi.Visible = WorksheetFunction.CountIf(ws.Range("CA_Range1"), pi.Name) > 0 
    Next pi 
End With 

'**-- so I would like the ActiveSheet.PivotTables("Segment").PivotFields("ReportDate") to equal a referencing calculated date cell on the same sheet e.g. cell Z4 = 12/02/2017** 

For each pt in ws.PivotTables 
    pt.ManualUpdate = False 
Next 

Application.ScreenUpdating = True 
Application.Calculation = xlCalculationAutomatic 
Application.EnableEvents = True 
ActiveSheet.DisplayPageBreaks = False 
Application.DisplayStatusBar = True 
Application.DisplayAlerts = True 

End Sub 

コード内のコメントに記載されているように、Pivo​​tItemsを非表示にする方法は問題に遭遇します。ピボットフィールドをフィルタリングするときに、最後のピボットアイテムを非表示にするとエラーが発生します。たとえば、5つのアイテムが表示され、合計10のアイテムがある場合、ループ中に最初の5つがループされ、すべてが非表示に設定されている場合、6番目から10番目のアイテムに関係なく、5番目のアイテムでエラーが発生します。見えるようにする。

私が知る限り、すべてのピボットテーブルを「キャンペーンコード」内の同じアイテムにフィルタリングしています。なぜこの作業にスライサーを使用しないのですか?この種のプロセスを処理するための装備がはるかに優れています。

関連する問題