在时间表内同时刷新外部数据源和数据透视表

Posted

技术标签:

【中文标题】在时间表内同时刷新外部数据源和数据透视表【英文标题】: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 秒后开始操作。 【参考方案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

【讨论】:

以上是关于在时间表内同时刷新外部数据源和数据透视表的主要内容,如果未能解决你的问题,请参考以下文章

如何刷新数据透视图

复制透视表样式时,系统提示“ excel无法从磁盘内获取数据透视表的源数据”

Excel数据透视表怎么刷新数据源

VBA自动刷新数据透视表

刷新数据透视表

需要登录凭据时刷新 OLAP(数据透视表)