数据透视表中的项目筛选速度慢(.ManualUpdate = True NOT WORKING)

时间:2018-08-09 10:13:01

标签: vba filtering pivot-table

我尝试使用VBA筛选我的数据透视表。禁用“计算,事件,屏幕和数据透视表.ManualUpdarte = True”没有帮助。我使用某些项目的VISIBLE属性。有人知道如何更快地完成这项工作吗?

请找到随附的示例,其中有一个子“ SLOWcode”: https://docs.google.com/file/d/1GjUpkC8-u2s5dOequEp9jp7HSaLvVP_1/edit?usp=docslist_api&filetype=msexcel

非常感谢

2 个答案:

答案 0 :(得分:0)

我写了一篇相当广泛的文章,内容是在http://dailydoseofexcel.com/archives/2013/11/14/filtering-pivots-based-on-external-ranges/上快速过滤外部范围的数据点

您将在此处找到广泛的代码以及详尽的讨论。该文章的重点是设置 .visible状态要比读取时间长。因此,您应该首先检查每个项目的.Visible属性,然后仅在必要时进行更改。我对您在代码中采用的这种方法所做的有效调整如下:

  • 将所有搜索词添加到词典(或集合)(如果需要)
  • 尝试将每个PivotItem添加到同一词典。
  • 如果最后一步导致错误,则说明此PivotItem是 在您的搜索字词列表中。在这种情况下,您可以检查 当前可见状态为PivotItem。如果看不见, 使其可见。如果可见,则不执行任何操作
  • 如果这没有引起错误,则说明此PivotItem IS 不在您的过滤条件列表中。在这种情况下,您再次检查 当前的可见状态为PivotItem。如果可见, 把它藏起来。如果已经隐藏了,什么也不做

此方法非常有效,因为它仅在必须时更改PivotItem的.visible状态。很好,因为根据我所链接的文章,这是瓶颈。与我在网上看到的其他使用applicaiton.match来检查PivotItem是否针对变体数组或(远不如)针对原始FilterTerms范围进行检查相比,使用Dictionary(或集合)的一般方法非常有效。在工作表中。

稍后在该Acticle中,我将展示如果使用除码器连接的Pivot副本(带有临时字段的感兴趣字段)以编程方式隐藏除一个PivotItem之外的所有内容,并通过.EnableMultiplePageItems以编程方式隐藏到Page字段中,您将如何从根本上进一步加快速度设置为False。这将迫使原始的PivotField具有相同的过滤器设置-仅可见一项。意味着您不必在要隐藏的其他“切片器”项目上设置。Visible = false

答案 1 :(得分:0)

这是使用VBA在数据透视表中仅选择一项的技巧:

             ActiveSheet.PivotTables(destTable).PivotFields(mainText).ClearAllFilters
                ActiveSheet.PivotTables(destTable).ManualUpdate = True

                varFirstItemVisible = mynames(0) ' e.g.: first searched item

                With ActiveSheet.PivotTables(helpTable).PivotFields(mainText)
                    .Orientation = xlPageField
                    .ClearAllFilters
                    .EnableMultiplePageItems = False
                    .CurrentPage = varFirstItemVisible
                End With


                Set sc = ActiveWorkbook.SlicerCaches.Add(ActiveSheet.PivotTables(helpTable), ActiveSheet.PivotTables(helpTable).PivotFields(mainText))
                sc.PivotTables.AddPivotTable ActiveSheet.PivotTables(destTable)
                sc.PivotTables.RemovePivotTable ActiveSheet.PivotTables(destTable)

然后循环浏览您想要的物品并使它们可见; D