VBA 清除 pivot table 缓存,但保留 pivot table 结构
VBA clear just pivot table cache, but leaving pivot table structure
如何使用 VBA 清除枢轴 table 缓存,但不破坏枢轴 table 结构?我的数据透视表 table 已连接到外部数据源。 SQL 源确定哪个用户应该看到数据的哪一部分。当 table 刷新时,源填充 table。我想保存 Excel 文件并使用干净的枢轴 table 分发它(里面没有数据)。
结果我想得到这个:
我围绕这段代码进行了试验,但没有成功。 VBA中没有PivotCaches.Clear这样的东西。
Sub PT_cache_clear()
For Each pc In ActiveWorkbook.PivotCaches
pc.Clear
Next pc
End Sub
我找到的唯一好的解决方案是使用有权访问 SQL 服务器源但不允许查看任何单个数据记录的用户刷新 table。
想法:
ActiveSheet.PivotTables("PivotTable1").SaveData = False
似乎没有达到预期的结果。
我这样做的方法是使用一个查询来刷新,该查询将 return table 结构但有 0 条记录。因此,如果从以下视图中选择:
select top 0 *
from vw_MyPivotData
如果使用存储过程,您可以发送一个参数以确保不会 return编辑任何记录,例如您知道数据中不存在的过滤器或为return没有记录的目的。
您不能只清除 PivotCache 而不影响枢轴 table,它们是不可分割地联系在一起的。您可以使用相同的 structure/schema 欺骗 PivotCache 加载和清空结果集。使用PivotTable.ChangeConnection函数在关闭文档前切换连接。
如果您在 excel 文件中定义了两个外部连接。一个 returns 正确的数据,另一个 returns 相同的结构但没有行。您可以将连接切换到无行版本并以这种方式刷新缓存。如果连接结果集的 structure/schema 之间存在任何差异,则 excel 将抛出错误消息。
在分发文件之前按需更改连接。
Sub PT_cache_clear()
'change connection'
Dim con as vartype
Set con = ActiveWorkbook.Connections("MyNoResultConnection")
Worksheets(1).PivotTables(1).ChangeConnection (con)
'refresh the pivot table cache'
Worksheets(1).PivotTables(1).PivotCache.Refresh
'clear the cache of any orphaned items'
Dim pc As PivotCache
Dim ws As Worksheet
With ActiveWorkbook
For Each pc In .PivotCaches
pc.MissingItemsLimit = xlMissingItemsNone
Next pc
End With
End Sub
每次 sheet 打开时更改为良好连接
Private Sub Workbook_Open()
Dim con as vartype
Set con = ActiveWorkbook.Connections("MyGoodResultConnection")
Worksheets(1).PivotTables(1).ChangeConnection (con)
Worksheets(1).PivotTables(1).PivotCache.Refresh
End Sub
您应该只需要在本地 PC 上设置 MyNoResultConnection
连接,因为用户不会呼叫 PT_cache_clear()
。
更新:
不必每次都更改枢轴 table 连接,您可以通过从 PivotCache.WorkbookConnection 属性 获取当前连接名称并比较名称来有条件地设置它。
Worksheets(1).PivotTables(1).PivotCache.WorkbookConnection
注:
- 不可能只刷新或清空数据透视缓存。您可以调用刷新方法或将其设置为在文件打开时自动刷新。您可以清除孤立项的缓存。
- PivotTable.ChangeConnection 和 PivotCache.WorkbookConnection 只能与外部数据源一起使用。
- 设置 PivotTable.SaveData to false will not clear the pivot cache. This stops the data source from being saved it does not affect the PivotCache. The PivotCache lies between the data source and pivot table. 使用外部数据源时,此 属性 将无效,对于 OLAP 数据源,它始终为 false。
- 查看帖子 here and here 以获取 PivotCache 的当前状态。
其他实现方式:
在工作簿打开时,使用 VBA 宏创建连接对象和数据透视 table。在工作簿关闭之前删除连接,枢轴 table。保存工作簿时,缓存将自动删除。根据外部数据源的设置方式,这种方法可能很困难。它可能需要您将用户名和密码存储在 VBA 代码中。
如何使用 VBA 清除枢轴 table 缓存,但不破坏枢轴 table 结构?我的数据透视表 table 已连接到外部数据源。 SQL 源确定哪个用户应该看到数据的哪一部分。当 table 刷新时,源填充 table。我想保存 Excel 文件并使用干净的枢轴 table 分发它(里面没有数据)。
结果我想得到这个:
我围绕这段代码进行了试验,但没有成功。 VBA中没有PivotCaches.Clear这样的东西。
Sub PT_cache_clear()
For Each pc In ActiveWorkbook.PivotCaches
pc.Clear
Next pc
End Sub
我找到的唯一好的解决方案是使用有权访问 SQL 服务器源但不允许查看任何单个数据记录的用户刷新 table。
想法:
ActiveSheet.PivotTables("PivotTable1").SaveData = False
似乎没有达到预期的结果。
我这样做的方法是使用一个查询来刷新,该查询将 return table 结构但有 0 条记录。因此,如果从以下视图中选择:
select top 0 *
from vw_MyPivotData
如果使用存储过程,您可以发送一个参数以确保不会 return编辑任何记录,例如您知道数据中不存在的过滤器或为return没有记录的目的。
您不能只清除 PivotCache 而不影响枢轴 table,它们是不可分割地联系在一起的。您可以使用相同的 structure/schema 欺骗 PivotCache 加载和清空结果集。使用PivotTable.ChangeConnection函数在关闭文档前切换连接。
如果您在 excel 文件中定义了两个外部连接。一个 returns 正确的数据,另一个 returns 相同的结构但没有行。您可以将连接切换到无行版本并以这种方式刷新缓存。如果连接结果集的 structure/schema 之间存在任何差异,则 excel 将抛出错误消息。
在分发文件之前按需更改连接。
Sub PT_cache_clear()
'change connection'
Dim con as vartype
Set con = ActiveWorkbook.Connections("MyNoResultConnection")
Worksheets(1).PivotTables(1).ChangeConnection (con)
'refresh the pivot table cache'
Worksheets(1).PivotTables(1).PivotCache.Refresh
'clear the cache of any orphaned items'
Dim pc As PivotCache
Dim ws As Worksheet
With ActiveWorkbook
For Each pc In .PivotCaches
pc.MissingItemsLimit = xlMissingItemsNone
Next pc
End With
End Sub
每次 sheet 打开时更改为良好连接
Private Sub Workbook_Open()
Dim con as vartype
Set con = ActiveWorkbook.Connections("MyGoodResultConnection")
Worksheets(1).PivotTables(1).ChangeConnection (con)
Worksheets(1).PivotTables(1).PivotCache.Refresh
End Sub
您应该只需要在本地 PC 上设置 MyNoResultConnection
连接,因为用户不会呼叫 PT_cache_clear()
。
更新:
不必每次都更改枢轴 table 连接,您可以通过从 PivotCache.WorkbookConnection 属性 获取当前连接名称并比较名称来有条件地设置它。
Worksheets(1).PivotTables(1).PivotCache.WorkbookConnection
注:
- 不可能只刷新或清空数据透视缓存。您可以调用刷新方法或将其设置为在文件打开时自动刷新。您可以清除孤立项的缓存。
- PivotTable.ChangeConnection 和 PivotCache.WorkbookConnection 只能与外部数据源一起使用。
- 设置 PivotTable.SaveData to false will not clear the pivot cache. This stops the data source from being saved it does not affect the PivotCache. The PivotCache lies between the data source and pivot table. 使用外部数据源时,此 属性 将无效,对于 OLAP 数据源,它始终为 false。
- 查看帖子 here and here 以获取 PivotCache 的当前状态。
其他实现方式:
在工作簿打开时,使用 VBA 宏创建连接对象和数据透视 table。在工作簿关闭之前删除连接,枢轴 table。保存工作簿时,缓存将自动删除。根据外部数据源的设置方式,这种方法可能很困难。它可能需要您将用户名和密码存储在 VBA 代码中。