在时间表内同时刷新外部数据源和数据透视表
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
【讨论】:
以上是关于在时间表内同时刷新外部数据源和数据透视表的主要内容,如果未能解决你的问题,请参考以下文章