ActiveWorkbook.Connections(“x”)时执行的代码。刷新完成

时间:2011-05-12 10:06:11

标签: sql-server excel-vba remote-connections vba excel

从外部来源选择数据
我有一个数据连接,使用{-1}}查询从SQL服务器将数据转发到Excel工作表中,使用如下的vba代码:

select

关联的数据透视表与导入的数据也需要刷新
但是,据我所知With ActiveWorkbook.Connections("x"). _ OLEDBConnection .BackgroundQuery = True .CommandText = Array( _ "SELECT ... FROM ... ... ActiveWorkbook.Connections("x").Refresh 运行asynchonious,我想执行刷新完成后运行的代码,以便我可以运行此代码:

ActiveWorkbook.Connections("x").Refresh

但仅在中读取数据时 我如何知道刷新何时获取所有数据?
我必须做什么才能在刷新完成后运行Private Sub UpdatePivot() Dim PV As PivotItem For Each PV In ActiveSheet.PivotTables("PT1").PivotFields("PN").PivotItems If PV.Name <> "(blank)" Then PV.Visible = True Else PV.Visible = False End If Next End Sub sub而不诉诸UpdatePivot hacks。

P.S。有时查询速度很快(<1秒),有时速度很慢(> 30秒),具体取决于我选择的确切数据,这是动态的。

3 个答案:

答案 0 :(得分:2)

这不是一个出色的解决方案,但您可以通过设置

使ActiveWorkbook.Connections("x").Refresh同步运行
.BackgroundQuery = False

另一个更复杂的解决方案是通过检查循环结构中的.Refreshing属性来轮询连接的状态。

答案 1 :(得分:1)

.BackgroundQuery = False将无法确保数据刷新后的同步执行。

通过创建一个简单的查询自己尝试,并在Worksheet_Change子例程中添加代码以选择几个单元格。在等待/超时圈出现之前,我经常可以触发2个命令。

因此我无法确定查询是否返回了正确的数据。我已经尝试将参考单元格设置为中间查询列的值,并检查两者是否相等 - 不幸的是Worksheet_Change事件在数据刷新时发生了两次!

这让我发疯了。我只需要在成功查询刷新后打印图表。

答案 2 :(得分:0)

这对我有用:

Sheets("Sheet1").ListObjects(1).QueryTable.Refresh BackgroundQuery:=False