使用共享缓存刷新一个数据透视图

时间:2019-02-19 18:08:14

标签: excel vba pivot-table

我遇到了一个宏问题,该宏应该允许我刷新数据透视表并避免重叠的错误消息。我以为自己找到了一种偷偷摸摸的方式来呈现这种情况,但是却遇到了共享数据源的问题。


在下面的结构中,我有5个数据透视表(每个数据透视表具有相同的数据源:Table1

Column A
----------
Pivot 1
'Two Blank Rows
Pivot 2
'Two Blank Rows
Pivot 3 
'Two Blank Rows
Pivot 4
'Two Blank Rows
Pivot 5
'Two Blank ROws

该宏旨在将Pivot 1移到6列上,单独刷新该轴(允许它根据需要扩展或压缩)。然后,宏将Pivot 2移至6列,并将其置于第一个枢轴下方两行,单独刷新该枢轴,依此类推。对所有枢轴重复此过程,然后删除6列,给人的印象是所有表都已返回除了表格行已相应地扩展/压缩外,其他所有行都没有展开ERROR: A pivot table cannot overlap another pivot table问题。停用ScreenUpdating时,给人的印象是枢轴正在刷新并动态调整其位置以允许扩展/压缩周围的表。


我遇到的问题是,当我刷新一个数据透视表时,其他4个枢轴会自动尝试刷新,这会产生其他4个表的重叠错误。 尽管有常见的数据透视缓存,如何一次只能刷新一个数据透视表?

我在循环中心尝试了两行代码,并尝试使用在this链接上找到的宏,该宏旨在分解共享的数据透视缓存,从而允许独立刷新。每次该链接上的宏都会使我的excel实例崩溃。

For i = LBound(OTCPvts) To UBound(OTCPvts)
    LRow = OTC.Range("O" & OTC.Rows.Count).End(xlUp).Offset(3).Row
    OTC.PivotTables(OTCPvts(i)).TableRange2.Cut OTC.Range("M" & LRow)
    On Error Resume Next

        OTC.PivotTables(OTCPvts(i)).PivotCache.Refresh 'Gives Overlap Error
        OTC.PivotTables(OTCPvts(i)).RefreshTable 'Does not refresh/change table

    On Error GoTo 0
Next i

仅显示相关代码-在进入Next i之前,该过程将继续进行过滤/排序,但一切正常

1 个答案:

答案 0 :(得分:1)

因此,重新审视此问题后,我发现了另一种hacky解决方法,该解决方法不需要多次移动表。虽然刷新共享的数据透视表缓存似乎会更新共享该缓存的所有数据透视表,但您可以在刷新之前将xlTopCount的值1应用于所有过滤器,然后移动每个表并删除过滤器

For i = LBound(OTCPvts) To UBound(OTCPvts)
    With OTC.PivotTables(OTCPvts(i))
        .ClearAllFilters
        .PivotFields("FieldName").PivotFilters.Add2 _
            Type:=xlTopCount, DataField:=.PivotFields("OtherFieldName"), Value1:=1
        .PivotCache.Refresh
        .RefreshTable
    End With
Next i
For i = LBound(OTCPvts) To UBound(OTCPvts)
    With OTC.PivotTables(OTCPvts(i))
        lRow = OTC.Range("O" & OTC.Rows.Count).End(xlUp).Offset(3).Row
        .TableRange2.Cut OTC.Range("M" & lRow)
        .ClearAllFilters
    End With
Next i

结果表明,更改/刷新数据透视表缓存或刷新表都不会删除过滤器,因此这是一种通过强制表的大小直到移动并删除过滤器来防止重叠的好方法。