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