刷新数据透视表但不刷新外部数据源
Refresh pivot tables but not external data source
我有一个包含多个 table 的电子表格,其中的数据是从外部数据源(SQL 数据库)提取的。 connections/tables 通过更改下拉框中的选项然后按按钮刷新 运行 到 VBA。
附加到每个 table 的是一个枢轴 table。枢轴 tables 不会用 tables 刷新。如果我尝试按全部刷新,我会收到错误消息;
'Data Source name not found and no default driver specified'
但是,如果我浏览电子表格并在每个单独的数据透视表上点击刷新 table,它们就会更新而不会出现错误。
所以要么我需要一些方法让枢轴tables用tables刷新,要么有一个按钮只刷新枢轴tables而不刷新外部数据连接。
任何想法表示赞赏,我不知道从哪里开始这个!
您可以像这样刷新 Sheet1 上给定的数据透视表:
Sheet1.PivotTables(1).RefreshTable
这将刷新 Sheet1 上的第一个数据透视表。将索引号更改为另一个索引号。
或者...
您可以通过调用此例程刷新给定 sheet 上的所有数据透视表:
Sub RefreshPivotTables(ws As Worksheet)
Dim pt As PivotTable
For Each pt In ws.PivotTables
pt.RefreshTable
Next
End Sub
您可以从与您问题中提到的用于更新表格的按钮关联的相同代码调用上述例程。
或者...
如果您想更新工作簿中的所有数据透视表,可以使用此例程的版本:
Sub RefreshPivotTables(wb As Workbook)
Dim ws As Worksheet
Dim pt As PivotTable
For Each ws In wb.Worksheets
For Each pt In ws.PivotTables
pt.RefreshTable
Next
Next
End Sub
你可以这样称呼这个版本:
RefreshPivotTables ThisWorkbook
Becky:您不直接从 SQL 查询填充那些 PivotTable 的原因是什么?除非你出于某种原因需要那些 tables,否则我建议你放弃它们,直接将数据转换为 PivotTables。否则,您实际上是在文件中两次保存相同的数据。 (或者三次,如果你没有取消选中 PivotTable>Data>Options 下的 "Save source data with file"。
如果您确实需要刷新它们 - 如果有多个 PivotTable 连接到每个 Table - 那么迭代底层 PivotCaches 并刷新任何地方会更有效sourcetype 是一个 Excel 范围。在 VBA 中说 pc.SourceType = xlDatabase
Sub Refresh_PivotCaches()
Dim pc As PivotCache
For Each pc In ActiveWorkbook.PivotCaches
If pc.SourceType = xlDatabase Then pc.Refresh
Next pc
End Sub
如果您改为遍历每个 PivotTable,那么如果 多个 PivotTable 连接到一个 PivotCache,您最终会做更多的事情比你需要的刷新。例如,如果您有 10 个 PivotTable 都指向同一个 table,您 不需要 需要刷新这 10 个 PivotTable单独的。相反,您只需要刷新它们共享的一个 PivotCache。如果您要单独刷新这 10 个 PivotTable,那么实际上您正在刷新这 10 个 PivotTable 中的每一个 10 次。
当然,如果您的 PivotTable 很小,您将不会注意到我的代码和 Excel 英雄之间的任何区别。
我在我的代码末尾添加了以下内容,似乎工作正常。
Dim PT As PivotTable
Dim WSH As Worksheet
For Each WSH In ThisWorkbook.Worksheets
For Each PT In WSH.PivotTables
PT.RefreshTable
Next PT
Next WSH
我知道这是一个旧的 post,但如果这可以帮助像我一样研究这个的人分享 - 这可能是 Excel 2016 年的新内容(我无权访问当前要测试的旧版本),但是我发现您可以禁用外部数据源上的 "Refresh with Refresh All" 设置。这将允许您使用“数据”选项卡中的 "Refresh All" 一次更新所有数据透视表 table,而无需再次更新外部数据源查询:
- 数据选项卡 > 连接部分 > 打开连接
- Select 在工作簿连接中创建一个连接 window 然后单击属性...
- 在属性 window 中,取消选中 "Refresh this connection on Refresh All"
的复选框
- 对您不想自动更新的任何其他外部连接重复上述步骤
我通过调用一次手动查询更新在报告宏中使用它:
(在查询创建的每个 table 中选择一个单元格)
ActiveWorkbook.Sheets("Completed").Select
Range("A2").Select
Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False
然后根据需要调用全部刷新来更新我的数据透视表 tables:
ActiveWorkbook.RefreshAll
我有一个包含多个 table 的电子表格,其中的数据是从外部数据源(SQL 数据库)提取的。 connections/tables 通过更改下拉框中的选项然后按按钮刷新 运行 到 VBA。
附加到每个 table 的是一个枢轴 table。枢轴 tables 不会用 tables 刷新。如果我尝试按全部刷新,我会收到错误消息;
'Data Source name not found and no default driver specified'
但是,如果我浏览电子表格并在每个单独的数据透视表上点击刷新 table,它们就会更新而不会出现错误。
所以要么我需要一些方法让枢轴tables用tables刷新,要么有一个按钮只刷新枢轴tables而不刷新外部数据连接。
任何想法表示赞赏,我不知道从哪里开始这个!
您可以像这样刷新 Sheet1 上给定的数据透视表:
Sheet1.PivotTables(1).RefreshTable
这将刷新 Sheet1 上的第一个数据透视表。将索引号更改为另一个索引号。
或者...
您可以通过调用此例程刷新给定 sheet 上的所有数据透视表:
Sub RefreshPivotTables(ws As Worksheet)
Dim pt As PivotTable
For Each pt In ws.PivotTables
pt.RefreshTable
Next
End Sub
您可以从与您问题中提到的用于更新表格的按钮关联的相同代码调用上述例程。
或者...
如果您想更新工作簿中的所有数据透视表,可以使用此例程的版本:
Sub RefreshPivotTables(wb As Workbook)
Dim ws As Worksheet
Dim pt As PivotTable
For Each ws In wb.Worksheets
For Each pt In ws.PivotTables
pt.RefreshTable
Next
Next
End Sub
你可以这样称呼这个版本:
RefreshPivotTables ThisWorkbook
Becky:您不直接从 SQL 查询填充那些 PivotTable 的原因是什么?除非你出于某种原因需要那些 tables,否则我建议你放弃它们,直接将数据转换为 PivotTables。否则,您实际上是在文件中两次保存相同的数据。 (或者三次,如果你没有取消选中 PivotTable>Data>Options 下的 "Save source data with file"。
如果您确实需要刷新它们 - 如果有多个 PivotTable 连接到每个 Table - 那么迭代底层 PivotCaches 并刷新任何地方会更有效sourcetype 是一个 Excel 范围。在 VBA 中说 pc.SourceType = xlDatabase
Sub Refresh_PivotCaches()
Dim pc As PivotCache
For Each pc In ActiveWorkbook.PivotCaches
If pc.SourceType = xlDatabase Then pc.Refresh
Next pc
End Sub
如果您改为遍历每个 PivotTable,那么如果 多个 PivotTable 连接到一个 PivotCache,您最终会做更多的事情比你需要的刷新。例如,如果您有 10 个 PivotTable 都指向同一个 table,您 不需要 需要刷新这 10 个 PivotTable单独的。相反,您只需要刷新它们共享的一个 PivotCache。如果您要单独刷新这 10 个 PivotTable,那么实际上您正在刷新这 10 个 PivotTable 中的每一个 10 次。
当然,如果您的 PivotTable 很小,您将不会注意到我的代码和 Excel 英雄之间的任何区别。
我在我的代码末尾添加了以下内容,似乎工作正常。
Dim PT As PivotTable
Dim WSH As Worksheet
For Each WSH In ThisWorkbook.Worksheets
For Each PT In WSH.PivotTables
PT.RefreshTable
Next PT
Next WSH
我知道这是一个旧的 post,但如果这可以帮助像我一样研究这个的人分享 - 这可能是 Excel 2016 年的新内容(我无权访问当前要测试的旧版本),但是我发现您可以禁用外部数据源上的 "Refresh with Refresh All" 设置。这将允许您使用“数据”选项卡中的 "Refresh All" 一次更新所有数据透视表 table,而无需再次更新外部数据源查询:
- 数据选项卡 > 连接部分 > 打开连接
- Select 在工作簿连接中创建一个连接 window 然后单击属性...
- 在属性 window 中,取消选中 "Refresh this connection on Refresh All" 的复选框
- 对您不想自动更新的任何其他外部连接重复上述步骤
我通过调用一次手动查询更新在报告宏中使用它: (在查询创建的每个 table 中选择一个单元格)
ActiveWorkbook.Sheets("Completed").Select
Range("A2").Select
Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False
然后根据需要调用全部刷新来更新我的数据透视表 tables:
ActiveWorkbook.RefreshAll