等到ActiveWorkbook.RefreshAll完成 - VBA

Mo2*_*Mo2 37 excel vba excel-vba

我有一个子调用ActiveWorkbook.RefreshAll从XML源带来新数据,然后对它进行多次修改.问题是没有足够的时间让RefreshAll命令完成,因此下面的子和函数最终没有正确执行,这导致重复的行没有被正确擦除.

我尝试过使用Application.WaitSleep函数,但它们似乎也暂停了刷新过程.我只是希望其余代码等到刷新过程完成后再执行其余代码.

有关如何实现这一点的任何想法?现在我只能通过不调用RefreshAll来修复它,这让我想到实现后续执行的第二个流程,但这不是一个好的解决方法.

如果有任何不清楚的地方,请告诉我.谢谢

编辑 所以我从下面的帖子中尝试了一些建议,这就是我能想到的.执行"记录宏",然后在表属性中取消选中"启用后台刷新"不会产生任何结果.之后我也做了一次刷新.这是录制的宏的结果:

With ActiveWorkbook.Connections("XMLTable")
        .Name = "XMLTable"
        .Description = ""
End With
ActiveWorkbook.Connections("XMLTable").refresh
Run Code Online (Sandbox Code Playgroud)

ActiveWorkbook.Connections类没有BackgroundQuery选项,因此我可以将其设置为False.有任何想法吗?

只是为了清楚.这是一个托管在网站上的XML文件,Excel将其导入并导入到表中.然后我将这些数据称为数据透视和其他内容.这里的目标是允许从网站到表的导入过程在执行任何其他命令之前完成.谢谢

编辑2: 经过一番研究后,我找到了这个页面:http://www.mrexcel.com/forum/excel-questions/564959-execute-code-after-data-connection-refresh-finished.html 看来XML类型的连接没有BackgroundQuery布尔值.该选项仅适用于ODBC和OLEDB连接,分别是xlConnectionTypeODBC和xlConnectionTypeOLEDB类型.我使用的XML连接是xlConnectionTypeXMLMAP类型,它没有BackgroundQuery选项.有没有人知道从哪里去?我想到的,现在唯一的解决办法是让在Excel工作表中两个不同的宏按钮,一个清爽,一个用于数据修改,但我宁愿保留该选项的最后.

Val*_*nte 47

我有同样的问题,但DoEvents没有帮助我,因为我的数据连接启用了后台刷新.相反,使用Wayne G. Dunn的答案作为起点,我创建了以下解决方案,对我来说效果很好;

Sub Refresh_All_Data_Connections()

    For Each objConnection In ThisWorkbook.Connections
        'Get current background-refresh value
        bBackground = objConnection.OLEDBConnection.BackgroundQuery

        'Temporarily disable background-refresh
        objConnection.OLEDBConnection.BackgroundQuery = False

        'Refresh this connection
        objConnection.Refresh

        'Set background-refresh value back to original value
        objConnection.OLEDBConnection.BackgroundQuery = bBackground
    Next

    MsgBox "Finished refreshing all data connections"

End Sub
Run Code Online (Sandbox Code Playgroud)

MSGBOX仅用于测试,一旦你快乐的代码等待即可消除.

此外,我更喜欢ThisWorkbookActiveWorkbook,因为我知道它将针对代码所在的工作簿,以防焦点发生变化.十分之九,这无关紧要,但我喜欢谨慎行事.

编辑:刚看到你编辑使用没有BackgroundQuery选项的xlConnectionTypeXMLMAP连接,抱歉.我会留下上面的任何人(像我一样)寻找一种刷新OLEDBConnection类型的方法.

  • 我也遇到了运行时错误 1004,但我正在尝试按照 @Dan 将 OLEDBConnection 更改为 ODBCConnection 的建议,因为我使用的是 ODBC DSN。但这产生了 1004 错误。然后我意识到,当您在更现代版本的 Excel 中创建 ODBC 连接时,它实际上将其保存为 OLEDBConnection。所以我使用了原始代码并且运行得很好。 (3认同)
  • 这对我有用,但是使用了ODBCConnection而不是OLEDB。 (2认同)

sub*_*bro 13

虽然@Wayne G. Dunn已经提供了代码.这是您不想编码的地方.并取消选中以禁用后台刷新.

在此输入图像描述


rob*_*tik 6

免责声明:据报道,以下代码遭遇了一些崩溃!小心使用.

根据Excel 2010及以上版本的答案,CalculateUntilAsyncQueriesDone刷新完成之前停止宏
ThisWorkbook.RefreshAll
Application.CalculateUntilAsyncQueriesDone


小智 6

您必须为所有查询关闭“后台刷新”。如果后台刷新处于打开状态,Excel 会在刷新发生时提前工作并且您遇到问题。

数据 > 连接 > 属性 >(取消选中)启用后台刷新


Way*_*unn 2

以下是用户p45cal于 2010 年从 MrExcel.com 线程Fails: ActiveWorkbook.RefreshAll BackgroundQuery:=False提出的解决方案:

或者:
将所有数据透视缓存的背景查询属性设置为 False,或者
循环遍历工作簿的所有数据透视缓存:

For Each pc In ActiveWorkbook.PivotCaches
     pc.BackgroundQuery = False
     pc.Refresh
 Next 
Run Code Online (Sandbox Code Playgroud)

这将使所有数据透视缓存后台查询属性保留为 false。您可以通过以下方式保留每个设置:

For Each pc In ActiveWorkbook.PivotCaches
    originalBGStatus = pc.BackgroundQuery
    pc.BackgroundQuery = False
    pc.Refresh
    pc.BackgroundQuery = originalBGStatus
Next
Run Code Online (Sandbox Code Playgroud)

(全部未经测试)