select/取消select所有数据透视项目

我有一个数据透视表,我试图根据数组中的值来select某些数据透视表项目。 我需要这个过程更快,所以我已经尝试使用Application.Calculation = xlCalculationManualPivotTables.ManualUpdate = True ,但似乎都没有工作; 数据透视表仍会重新计算每次更改数据透视表项目时。

有什么我可以做不同的方式来防止Excel每次重新计算? 还是有办法一次取消所有的项目(而不是单独),使过程更快?

这是我的代码:

 Application.Calculation = xlCalculationManual 'code to fill array with list of companies goes here Dim PT As Excel.PivotTable Set PT = Sheets("LE Pivot Table").PivotTables("PivotTable1") Sheets("LE Pivot Table").PivotTables("PivotTable1").ManualUpdate = True Dim pivItem As PivotItem 'compare pivot items to array. 'If pivot item matches an element of the array, make it visible=true, 'otherwise, make it visible=false For Each pivItem In PT.PivotFields("company").PivotItems pivItem.Visible = False 'initially make item unchecked For Each company In ArrayOfCompanies() If pivItem.Value = company Then pivItem.Visible = True End If Next company Next pivItem 

看来,你真的想尝试一些不同的东西,大大减lessselect所需物品的时间。 我build议使用“MirrorField”,也就是“Company”的副本,用来在pivottable的sourcedata中设置你需要隐藏\ show的项目。

首先,您需要手动(或编程)添加“MirrorField”,并将其命名为与源字段相同的名称,如“!Company”中的特殊字符,该项目必须是源数据的一部分,并且可以放在它(因为这将是一个“程序员”字段,我会把它放在最后一列,可能隐藏,以避免为用户创build任何问题)

请在代码下面find更新pivottable数据源并刷新pivottable

我还要求更新PivotField,使其更灵活,因为它可以用于任何领域(前提是已经创build了“FieldMirror”)最后:如果您在可转换工作表中运行任何事件,应该禁用并仅启用最后一次枢轴表更新

希望这是你在找什么。

 Sub Ptb_ShowPivotItems_MirrorField(vPtbFld As Variant, aPtbItmSelection As Variant) Dim oPtb As PivotTable Dim rPtbSrc As Range Dim iCol(2) As Integer Dim sRC(2) As String Dim sFmlR1C1 As String Dim sPtbSrcDta As String Rem Set PivotTable & SourceData Set oPtb = ActiveSheet.PivotTables(1) sPtbSrcDta = Chr(34) & oPtb.SourceData & Chr(34) Set rPtbSrc = Evaluate("=INDIRECT(" & sPtbSrcDta & ",0)") Rem Get FieldMirrow Position in Pivottable SourceData (FieldMirrow Already present SourceData) With rPtbSrc iCol(1) = -1 + .Column + Application.Match(vPtbFld, .Rows(1), 0) iCol(2) = Application.Match("!" & vPtbFld, .Rows(1), 0) End With Rem Set FieldMirror Items PivotTable SourceData as per User Selection sRC(1) = """|""&RC" & iCol(1) & "&""|""" sRC(2) = """|" & Join(aPtbItmSelection, "|") & "|""" sFmlR1C1 = "=IF(ISERROR(SEARCH(" & sRC(1) & "," & sRC(2) & ")),""N/A"",""Show"")" With rPtbSrc.Offset(1).Resize(-1 + rPtbSrc.Rows.Count).Columns(iCol(2)) .Value = "N/A" .FormulaR1C1 = sFmlR1C1 .Value = .Value2 End With Rem Refresh PivotTable & Select FieldMirror Items With oPtb Rem Optional: Disable Events - In case you are running any events in the pivottable worksheet Application.EnableEvents = False .ClearAllFilters .PivotCache.Refresh With .PivotFields("!" & vPtbFld) .Orientation = xlPageField .EnableMultiplePageItems = False Rem Optional: Enable Events - To triggrer the pivottable worksheet events only with last update Application.EnableEvents = True .CurrentPage = "Show" End With: End With End Sub 

每次更新一个pivotitem时,似乎不可避免地要刷新pivotable。 但是,我试图从相反的angular度来处理这个问题。 即:

1.在更新数据透视表之前,validation“要隐藏的数据透视图”。

同时使所有项目一次可见,而不是一开始就使项目不被选中。

3.然后隐藏所有未被用户select的项目(隐藏数据透视

我从总共11个公司中挑选了6家公司进行了testing,并且数据透视表更新了7次

冉也是你的原始代码与相同的情况和透视表已更新16次查找下面的代码

 Sub Ptb_ShowPivotItems(aPtbItmSelection As Variant) Dim oPtb As PivotTable Dim oPtbItm As PivotItem Dim aPtbItms() As PivotItem Dim vPtbItm As Variant Dim bPtbItm As Boolean Dim bCnt As Byte Set oPtb = ActiveSheet.PivotTables(1) bCnt = 0 With oPtb.PivotFields("Company") ReDim Preserve aPtbItms(.PivotItems.Count) For Each oPtbItm In .PivotItems bPtbItm = False For Each vPtbItm In aPtbItmSelection If oPtbItm.Name = vPtbItm Then bPtbItm = True Exit For End If: Next If Not (bPtbItm) Then bCnt = 1 + bCnt Set aPtbItms(bCnt) = oPtbItm End If Next ReDim Preserve aPtbItms(bCnt) .ClearAllFilters For Each vPtbItm In aPtbItms vPtbItm.Visible = False Next End With End Sub