Mo2*_*Mo2 37 excel vba excel-vba
我有一个子调用ActiveWorkbook.RefreshAll从XML源带来新数据,然后对它进行多次修改.问题是没有足够的时间让RefreshAll命令完成,因此下面的子和函数最终没有正确执行,这导致重复的行没有被正确擦除.
我尝试过使用Application.Wait和Sleep函数,但它们似乎也暂停了刷新过程.我只是希望其余代码等到刷新过程完成后再执行其余代码.
有关如何实现这一点的任何想法?现在我只能通过不调用RefreshAll来修复它,这让我想到实现后续执行的第二个流程,但这不是一个好的解决方法.
如果有任何不清楚的地方,请告诉我.谢谢
编辑 所以我从下面的帖子中尝试了一些建议,这就是我能想到的.执行"记录宏",然后在表属性中取消选中"启用后台刷新"不会产生任何结果.之后我也做了一次刷新.这是录制的宏的结果:
With ActiveWorkbook.Connections("XMLTable")
        .Name = "XMLTable"
        .Description = ""
End With
ActiveWorkbook.Connections("XMLTable").refresh
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
该MSGBOX仅用于测试,一旦你快乐的代码等待即可消除.
此外,我更喜欢ThisWorkbook到ActiveWorkbook,因为我知道它将针对代码所在的工作簿,以防焦点发生变化.十分之九,这无关紧要,但我喜欢谨慎行事.
编辑:刚看到你编辑使用没有BackgroundQuery选项的xlConnectionTypeXMLMAP连接,抱歉.我会留下上面的任何人(像我一样)寻找一种刷新OLEDBConnection类型的方法.
以下是用户p45cal于 2010 年从 MrExcel.com 线程Fails: ActiveWorkbook.RefreshAll BackgroundQuery:=False提出的解决方案:
或者:
将所有数据透视缓存的背景查询属性设置为 False,或者
循环遍历工作簿的所有数据透视缓存:Run Code Online (Sandbox Code Playgroud)For Each pc In ActiveWorkbook.PivotCaches pc.BackgroundQuery = False pc.Refresh Next这将使所有数据透视缓存后台查询属性保留为 false。您可以通过以下方式保留每个设置:
Run Code Online (Sandbox Code Playgroud)For Each pc In ActiveWorkbook.PivotCaches originalBGStatus = pc.BackgroundQuery pc.BackgroundQuery = False pc.Refresh pc.BackgroundQuery = originalBGStatus Next(全部未经测试)