在我上一篇文章Auto refresh pivottables data in excel on first run 中,我发现在我第一次执行时,来自外部数据源的查询被刷新,大约需要 1 分钟才能执行。在我的第二次运行中,数据透视表已更新。
是否有解决方案(VBA 代码)通过单击在时间安排(如果我们设置了计时器)内同时刷新外部数据源和数据透视表command button
?
在我上一篇文章Auto refresh pivottables data in excel on first run 中,我发现在我第一次执行时,来自外部数据源的查询被刷新,大约需要 1 分钟才能执行。在我的第二次运行中,数据透视表已更新。
是否有解决方案(VBA 代码)通过单击在时间安排(如果我们设置了计时器)内同时刷新外部数据源和数据透视表command button
?
在连接属性下,取消选中“启用后台刷新”。这将使连接在被告知时刷新,而不是在其他进程发生时在后台刷新。
禁用后台刷新后,您的 VBA 过程将等待您的外部数据刷新,然后再移动到下一行代码。
然后你只需修改以下代码:
ActiveWorkbook.Connections("CONNECTION_NAME").Refresh
Sheets("SHEET_NAME").PivotTables("PIVOT_TABLE_NAME").PivotCache.Refresh
您还可以在 VBA 中关闭后台刷新:
ActiveWorkbook.Connections("CONNECTION_NAME").ODBCConnection.BackgroundQuery = False
我使用了上述答案,但使用了 RefreshAll 方法。我还对其进行了更改以允许多个连接而无需指定名称。然后我将它链接到我的电子表格上的一个按钮。
Sub Refresh()
Dim conn As Variant
For Each conn In ActiveWorkbook.Connections
conn.ODBCConnection.BackgroundQuery = False
Next conn
ActiveWorkbook.RefreshAll
End Sub
我认为有一种更简单的方法可以让 excel 等到刷新完成,而无需将 Background Query 属性设置为 False。为什么要乱弄人们的喜好呢?
Excel 2010(及更高版本)具有称为 CalculateUntilAsyncQueriesDone 的方法,您只需在调用 RefreshAll 方法后调用它。Excel 将等待计算完成。
ThisWorkbook.RefreshAll
Application.CalculateUntilAsyncQueriesDone
在将我的模型发送给其他人之前,我通常将这些东西放在一起进行不间断的主计算。像这样的东西:
ThisWorkbook.RefreshAll
Application.CalculateUntilAsyncQueriesDone
Application.CalculateFullRebuild
Application.CalculateUntilAsyncQueriesDone
例如每 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
:)
我在网上找到了这个解决方案,它很好地解决了这个问题。我唯一担心的是循环遍历所有枢轴,如果它们很多,查询可能会变得很耗时:
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