从外部来源选择数据
我有一个数据连接,使用{-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秒),具体取决于我选择的确切数据,这是动态的。
答案 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