2013-04-25 77 views
6

以我过去后Auto refresh pivottables data in excel on first run内的外部数据源和数据透视表一起,我发现我的第一执行查询外部数据源被刷新,需要大约1分钟执行。并在我的第二次运行中,数据透视表被更新。刷新两个时间表

是否有解决方案(VBA代码)以刷新两个时间表内外部数据源和数据透视表一起通过点击command button(如果假设我们设定一个计时器)?

+0

'第一件事第一'这意味着你应该确保你的查询刷新之前,你更新PT。取决于你创建查询的方式,你可以像描述的那样控制'AfterRefresh事件'(或类似)[该描述](http://msdn.microsoft.com/en-us/library/ff835922%28v=office.14 %29.aspx)...比你能刷新你的PT确保你的数据是最新的。 – 2013-04-25 18:53:08

+0

我的数据每晚更新。 – user42995 2013-04-25 19:03:09

+0

'Application.OnTime'怎么样? – 2013-04-25 19:14:34

回答

17

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

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

然后你只需修改下面的代码:

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

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

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

谢谢,我已将'BackgroundQuery'设置为'false'。我解决了我在之前的文章中指定的问题。非常感谢你花费宝贵的时间。 – user42995 2013-04-25 21:38:34

+0

谢谢,这是一个演出和简洁的答案!我也想更新我的数据透视表,但没有数据源刷新,我想我需要一个奇迹。 – fuadj 2017-11-09 19:50:40

8

我用上面的答案,但利用了RefreshAll方法。我也改变了它,以允许多个连接,而不必指定名称。然后我将它链接到电子表格上的按钮。

Sub Refresh() 

    Dim conn As Variant 

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

    ActiveWorkbook.RefreshAll 
End Sub 
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

我认为这是一个简单的使Excel等到刷新完成的方式,而不必将Background Query属性设置为False。为何混淆了人们的喜好?

Excel 2010(及更高版本)具有称为CalculateUntilAsyncQueriesDone的此方法,您必须在调用RefreshAll方法后调用它。 Excel将等待计算完成。

ThisWorkbook.RefreshAll 
Application.CalculateUntilAsyncQueriesDone 

我通常把这些东西一起做高手全算不中断,发送我的模型给别人之前。这样的事情:

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