等待ActiveWorkbook.RefreshAll完成-VBA

等待ActiveWorkbook.RefreshAll完成-VBA,vba,excel,Vba,Excel,我有一个sub,它调用ActiveWorkbook.RefreshAll从XML源引入新数据,然后对其执行多次修改。问题在于没有足够的时间让RefreshAll命令完成,因此以下子命令和函数最终无法正确执行,从而导致重复的行无法正确擦除 我尝试过使用应用程序。Wait和Sleep功能,但它们似乎也暂停了刷新过程。我只是想让代码的其余部分等到刷新过程完成后再执行代码的其余部分 关于如何实现这一点有什么想法吗?现在我只能通过不调用RefreshAll来修复它,这让我想到了实现第二个流,然后再执行,但

我有一个sub,它调用ActiveWorkbook.RefreshAll从XML源引入新数据,然后对其执行多次修改。问题在于没有足够的时间让RefreshAll命令完成,因此以下子命令和函数最终无法正确执行,从而导致重复的行无法正确擦除

我尝试过使用应用程序。WaitSleep功能,但它们似乎也暂停了刷新过程。我只是想让代码的其余部分等到刷新过程完成后再执行代码的其余部分

关于如何实现这一点有什么想法吗?现在我只能通过不调用RefreshAll来修复它,这让我想到了实现第二个流,然后再执行,但这不是一个好的解决方法

如果有不清楚的地方,请告诉我。谢谢

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

With ActiveWorkbook.Connections("XMLTable")
        .Name = "XMLTable"
        .Description = ""
End With
ActiveWorkbook.Connections("XMLTable").refresh
ActiveWorkbook.Connections没有BackgroundQuery选项,因此我可以将其设置为False。有什么想法吗

我只是想说清楚。这是一个托管在网站上的XML文件,Excel将其导入到表中。然后,我将这些数据称为枢轴和其他东西。这里的目标是允许在执行任何其他命令之前完成从网站到表的导入过程。 谢谢

EDIT2: 经过进一步研究,我发现了以下页面: XML类型的连接似乎没有背景查询布尔值。该选项仅适用于ODBC和OLEDB连接,它们分别是xlConnectionTypeODBC和xlConnectionTypeOLEDB类型。我使用的XML连接是xlConnectionTypeXMLMAP类型,它没有BackgroundQuery选项。
有人知道从这里到哪里去吗?我现在想到的唯一解决方案是在excel工作表上创建两个单独的宏按钮,一个用于刷新,一个用于修改数据,但我宁愿将该选项保留到最后。

以下是一个解决方案:

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

Code:
    For Each pc In ActiveWorkbook.PivotCaches
       pc.BackgroundQuery = False
       pc.Refresh
    Next 
这将使所有pivotcaches backgroundquery属性保留为false。您可以通过以下方式保留每个设置:

代码:


我也有同样的问题,但是,DoEvents对我没有帮助,因为我的数据连接启用了后台刷新。相反,以的答案为出发点,我创建了以下解决方案,对我来说效果很好

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,因为我知道它将以代码所在的工作簿为目标,以防焦点发生变化。十有八九,这无关紧要,但我喜欢在谨慎方面犯错

编辑:刚才看到您关于使用xlConnectionTypeXMLMAP连接的编辑,该连接没有BackgroundQuery选项,很抱歉。我将把以上内容留给任何想刷新OLEDB连接类型的人(像我一样)。

尝试执行:

ActiveSheet.Calculate

我在工作表中使用它,其中控制按钮更改数据集的值。每次单击时,Excel都会运行此命令,图形会立即更新。

这可能不太理想,但请尝试使用“Application.OnTime”暂停其余代码的执行,直到经过足够的时间以确保所有刷新过程都已完成

如果刷新列表中的最后一个表是一个人造表,它只包含一个表示刷新已完成的标志,该怎么办?该表将在程序开始时删除,然后使用“Application.OnTime”每隔15秒左右运行一次Sub,检查是否已填充人造表。如果已填充,请停止“Application.OnTime”检查器并继续执行其余过程


有点不稳定,但它应该能工作。

我也遇到了同样的问题,尝试了上述所有解决方案,但都没有成功。我最终通过删除整个查询并创建一个新查询解决了这个问题

新的一个与不起作用的一个设置完全相同(字面上与我复制旧的查询定义相同)


我不知道这为什么解决了这个问题,但确实解决了。

如果您还没有习惯使用Excel Web Query,您可以尝试将URL作为单独的工作簿打开。通过该路径,您可以在web请求完成后处理生成的数据,就像关闭“启用后台刷新”一样

不过好的是,Excel在请求过程中显示一个进度条,而不是在目标单元格中冻结/显示加载消息

见我对这个问题的回答:

这种方法的折衷之处在于,您必须自己管理处理返回的数据——Excel不会为您将数据放在给定的目标中


在我们尝试了一些类似于您所做的事情之后,我们最终走上了这条路线。

尽管@Wayne G.Dunn已经给出了代码。这里是你不想编码的地方。然后取消选中以禁用背景刷新


免责声明:据报道,下面的代码导致了一些崩溃!小心使用。

根据Excel 2010及更高版本中的
CalculateUntilAsyncQueriesDone
停止宏,直到刷新完成
此工作簿。RefreshAllActiveSheet.Calculate
ActiveWorkbook.refreshall
ActiveWorkbook.Save
With ActiveWorkbook.Connections("Query - DL_3").OLEDBConnection
    .BackgroundQuery = False
    End With
.QueryTable.Refresh BackgroundQuery:=False
VBA.Interaction.DoEvents
Workbooks.Open("File_where_you_have_to_do_refresh.xlsx")
Workbooks("File_where_you_have_to_do_refresh.xlsx").RefreshAll

Workbooks.Open("Any_file.xlsx)
'Excell is waiting till Refresh on first file will finish'
Workbooks("Any_file.xlsx).Close False

Workbooks("File_where_you_have_to_do_refresh.xlsx").Save
Workbooks("File_where_you_have_to_do_refresh.xlsx").Close True