【问题标题】:Refresh One Pivot with Shared Cache使用共享缓存刷新一个枢轴
【发布时间】:2019-07-13 07:44:48
【问题描述】:

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


我在下面的结构中有 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,但这一切正常

【问题讨论】:

  • 我想一种解决方法是先将所有表并排放置,然后刷新所有表,然后按所需顺序放回它们。无论哪种方式,想知道是否有其他人知道如何按原样解决问题
  • 我实际上正要提出这个建议,因为不久前我遇到了类似的问题,我已经以同样的方式解决了。我也想不出一种在共享缓存时只刷新一个数据透视表的方法。希望我们今天都能学到一些东西。

标签: excel vba pivot-table


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 2016-11-17
    • 1970-01-01
    • 2014-09-21
    • 2017-08-04
    相关资源
    最近更新 更多