【问题标题】:Refresh pivot tables but not external data source刷新数据透视表但不刷新外部数据源
【发布时间】:2016-01-11 11:45:34
【问题描述】:

我有一个包含多个表的电子表格,其中数据是从外部数据源(SQL 数据库)中提取的。通过更改下拉框中的选项并按下按钮运行 VBA 来刷新连接/表。

每个表都附有一个数据透视表。数据透视表不会随表格一起刷新。如果我尝试按全部刷新,我会收到错误消息;

'未找到数据源名称且未指定默认驱动程序'

但是,如果我浏览电子表格并在每个单独的数据透视表上点击刷新,它们会更新而不会出现错误。

所以要么我需要某种方法来让数据透视表随表格一起刷新,要么有一个按钮只刷新数据透视表而不刷新外部数据连接。

感谢任何想法,我不知道从哪里开始!

【问题讨论】:

    标签: excel external pivot-table


    【解决方案1】:

    您可以像这样刷新 Sheet1 上的给定数据透视表:

    Sheet1.PivotTables(1).RefreshTable
    

    这将刷新 Sheet1 上的第一个数据透视表。更改其他索引号。

    或者……

    您可以通过调用此例程来刷新给定工作表上的所有数据透视表:

    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 请在我的答案底部查看更新。
    • 我收到错误消息; '438 - 对象不支持此属性或方法'?
    • @Becky 你能发给我一个发生此错误的示例文件吗?我的电子邮件地址是:daniel.ferry@gmail.com
    • 我认为我不能发送文件,因为它需要连接到我们的数据库。它突出显示的行是“For Each ws in wb”。我把你的子代码放在我原来的子上面,但是如果这有意义的话放在一个新的子中,然后在我的代码底部调用它。
    【解决方案2】:

    Becky:您有什么理由不直接从 SQL 查询中填充这些数据透视表?除非您出于某种原因需要这些表,否则我建议您放弃它们,并将数据直接转换为数据透视表。否则,您实际上是在文件中两次保存相同的数据。 (或者三次,如果您没有取消选中 PivotTable>Data>Options 下的“Save source data with file”。

    如果您确实需要刷新它们——并且如果有多个数据透视表连接到每个表——那么迭代底层数据透视缓存并刷新任何源类型为 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
    

    如果您改为遍历每个数据透视表,那么如果 多个 数据透视表连接到一个数据透视缓存,您最终会进行比您需要的更多的刷新。例如,如果您有 10 个数据透视表都指向同一个表,那么您确实不需要单独刷新这 10 个数据透视表。相反,您只需要刷新他们都共享的一个 PivotCache。如果您要单独刷新这 10 个数据透视表,那么实际上您将这 10 个数据透视表中的每一个刷新 10 次。

    当然,如果您的数据透视表很小,您不会注意到我的代码和 Excel Heros 之间有任何区别。

    【讨论】:

    • 不幸的是,我需要原始数据转储以及汇总数据。
    【解决方案3】:

    我在我的代码末尾添加了以下内容,这似乎工作正常。

    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
    

    【讨论】:

      【解决方案4】:

      我知道这是一篇旧帖子,但如果这有助于任何像我一样研究此问题的人 - 这可能是 Excel 2016 的新内容(我目前无法访问旧版本进行测试),但是我发现您可以禁用外部数据源上的“全部刷新”设置。这将允许您使用“数据”选项卡中的“全部刷新”来一次更新所有数据透视表,而无需再次更新外部数据源查询:

      1. 数据选项卡 > 连接部分 > 打开连接
      2. 在工作簿连接窗口中选择一个连接,然后单击属性...
      3. 在属性窗口中,取消选中“全部刷新时刷新此连接”复选框
      4. 对您不想自动更新的任何其他外部连接重复此操作

      我通过调用手动查询更新一次来在报告宏中使用它: (在查询创建的每个表中选择一个单元格)

      ActiveWorkbook.Sheets("Completed").Select
      Range("A2").Select
      Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False
      

      然后根据需要调用 refresh all 来更新我的数据透视表:

      ActiveWorkbook.RefreshAll
      

      【讨论】:

      • 感谢您添加截图内嵌如陈冲!我创建了一个新帐户,所以我还不能添加内嵌图片。
      猜你喜欢
      • 2018-12-30
      • 2016-09-07
      • 2013-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-12
      • 2021-10-25
      相关资源
      最近更新 更多