【问题标题】:refresh both the External data source and pivot tables together within a time schedule在时间表内同时刷新外部数据源和数据透视表
【发布时间】:2013-04-19 18:44:32
【问题描述】:

在我的上一篇帖子Auto refresh pivottables data in excel on first run 中,我发现在我的第一次执行中,来自外部数据源查询被刷新并占用了大约 1 分钟执行。在我的第二次运行中,数据透视表已更新。

是否有解决方案(VBA 代码)通过单击command button 在时间安排(如果我们设置了计时器)内同时刷新外部数据源和数据透视表?

【问题讨论】:

  • 'first thing first' 这意味着您应该确保在更新 PT 之前刷新查询。根据您创建查询的方式,您可能会控制 AfterRefresh event 就像描述(或类似)到 that description... 而不是刷新您的 PT 以确保您的数据是最新的。
  • 我的数据每晚都会更新。
  • Application.OnTime 呢?
  • 我不想设置特定的刷新时间。当我点击command button 时,我希望它刷新。当我单击按钮时。刷新需要1 -2 minutes。相反,我想设置一个时间(当我单击按钮时,它必须在 10 秒内刷新数据)
  • 使用Application.OnTime,您可以将开始时间设置为触发时刻的差异,例如。 Application.OnTime Now + TimeValue("00:00:10") 10 秒后开始操作。

标签: excel pivot-table vba


【解决方案1】:

在连接属性下,取消选中“启用后台刷新”。这将使连接在被告知时刷新,而不是在其他进程发生时在后台刷新。

在禁用后台刷新的情况下,您的 VBA 过程将等待您的外部数据刷新,然后再移动到下一行代码。

那你只需修改以下代码:

ActiveWorkbook.Connections("CONNECTION_NAME").Refresh
Sheets("SHEET_NAME").PivotTables("PIVOT_TABLE_NAME").PivotCache.Refresh

您也可以在 VBA 中关闭后台刷新:

ActiveWorkbook.Connections("CONNECTION_NAME").ODBCConnection.BackgroundQuery = False

【讨论】:

  • 谢谢,我已将BackgroundQuery 设置为false。我已经解决了我在之前的帖子中指定的问题。非常感谢您花费宝贵的时间。
  • 谢谢,这是一个简明扼要的回答!!我还想在不刷新数据源的情况下更新我的数据透视表,我认为我需要一个奇迹。
【解决方案2】:

我使用了上述答案,但使用了 RefreshAll 方法。我还对其进行了更改以允许多个连接而无需指定名称。然后我将它链接到我的电子表格上的一个按钮。

Sub Refresh()

    Dim conn As Variant

    For Each conn In ActiveWorkbook.Connections
        conn.ODBCConnection.BackgroundQuery = False
    Next conn

    ActiveWorkbook.RefreshAll
End Sub

【讨论】:

    【解决方案3】:

    我认为有一种更简单的方法可以让 excel 等到刷新完成,而无需将 Background Query 属性设置为 False。为什么要乱弄人们的喜好呢?

    Excel 2010(及更高版本)有一个名为 CalculateUntilAsyncQueriesDone 的方法,您只需在调用 RefreshAll 方法后调用它。 Excel 将等待计算完成。

    ThisWorkbook.RefreshAll
    Application.CalculateUntilAsyncQueriesDone
    

    在将我的模型发送给其他人之前,我通常会将这些东西放在一起进行完整的主计算而不会中断。像这样的:

    ThisWorkbook.RefreshAll
    Application.CalculateUntilAsyncQueriesDone
    Application.CalculateFullRebuild
    Application.CalculateUntilAsyncQueriesDone
    

    【讨论】:

      【解决方案4】:

      自动刷新工作簿,例如每 5 秒一次。 应用于模块

      Public Sub Refresh()
      'refresh
      ActiveWorkbook.RefreshAll
      
      alertTime = Now + TimeValue("00:00:05") 'hh:mm:ss
          Application.OnTime alertTime, "Refresh"
      
      End Sub
      

      在打开时应用到工作簿

      Private Sub Workbook_Open()
      alertTime = Now + TimeValue("00:00:05") 'hh:mm:ss
      Application.OnTime alertTime, "Refresh"
      End Sub
      

      :)

      【讨论】:

        【解决方案5】:

        我在网上找到了这个解决方案,它很好地解决了这个问题。我唯一担心的是循环遍历所有枢轴,如果它们很多,查询可能会变得很耗时:

        Sub RefreshTables()
        
        Application.DisplayAlerts = False
        Application.ScreenUpdating = False
        
        Dim objList As ListObject
        Dim ws As Worksheet
        
        For Each ws In ActiveWorkbook.Worksheets
            For Each objList In ws.ListObjects
                If objList.SourceType = 3 Then
                    With objList.QueryTable
                        .BackgroundQuery = False
                        .Refresh
                    End With
                End If
            Next objList
        Next ws
        
        Call UpdateAllPivots
        
        Application.ScreenUpdating = True
        Application.DisplayAlerts = True
        
        End Sub
        
        Sub UpdateAllPivots()
        Dim pt As PivotTable
        Dim ws As Worksheet
        
        For Each ws In ActiveWorkbook.Worksheets
            For Each pt In ws.PivotTables
                pt.RefreshTable
            Next pt
        Next ws
        
        End Sub
        

        【讨论】:

          猜你喜欢
          • 2016-01-11
          • 2018-12-30
          • 2016-09-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-25
          相关资源
          最近更新 更多