Excel / VB:使用一个值列表过滤多元数据透视表

我试图从引用的值列表中筛选一张工作表上的多个数据透视表,但它看起来像只处理第一个With语句(CampaignAnalysis),然后返回一个错误(MailCount)。 任何帮助,这将是真棒! 谢谢!

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 

 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 eg 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 

首先,让我们像这样重构你的代码。 这样做应该使debugging更容易。

 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 eg 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 

正如您的代码中的注释所述,您用来隐藏数据透视项的方法将遇到问题。 当过滤pivotfields时,你会收到一个错误,当试图隐藏最后一个pivotitem。 例如,如果您有5个项目可见,并且总共有10个项目,但是在循环过程中,前5个项目是循环的,并且它们都被设置为不可见,那么无论是否应该在第5个项目上都会遇到错误可见。

从我可以告诉你,你正在过滤所有的数据透视表在“营销活动代码”相同的项目。 为什么不使用切片机来完成这项任务? 装备这种工艺的装备要好得多。