Sql server ActiveWorkbook.Connections(";x";)刷新完成时要执行的代码

Sql server ActiveWorkbook.Connections(";x";)刷新完成时要执行的代码,sql-server,excel,remote-connections,vba,Sql Server,Excel,Remote Connections,Vba,从外部源选择数据 我有一个数据连接,它使用以下vba代码使用select查询将数据从SQL server检索到Excel工作表中: With ActiveWorkbook.Connections("x"). _ OLEDBConnection .BackgroundQuery = True .CommandText = Array( _ "SELECT ... FROM ... ... ActiveWorkbook.Connections("x").Refresh

从外部源选择数据
我有一个数据连接,它使用以下vba代码使用
select
查询将数据从SQL server检索到Excel工作表中:

With ActiveWorkbook.Connections("x"). _
    OLEDBConnection
    .BackgroundQuery = True
    .CommandText = Array( _
    "SELECT ... FROM ...
...
ActiveWorkbook.Connections("x").Refresh
链接到导入数据的透视表也需要刷新
但是,据我所知,
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
Private Sub UpdatePivot()
将PV设置为数据透视项
对于ActiveSheet.PivotTables(“PT1”).PivotFields(“PN”).PivotItems中的每个PV
如果PV.Name“(空白)”则
PV.Visible=True
其他的
PV.Visible=False
如果结束
下一个
端接头
但仅当数据读入时
如何知道刷新何时完成并获取所有数据?
我必须做什么才能在刷新完成后运行
UpdatePivot
sub,而不必求助于
sleep
hacks


另外,有时查询速度很快(这不是一个很好的解决方案,但您可以通过设置

.BackgroundQuery = False

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

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

通过创建一个简单的查询并在工作表的“更改”子例程中添加代码来选择几个单元格,自己尝试一下。在等待/超时循环出现之前,我通常可以发出两个命令

因此,我无法确定查询是否返回了正确的数据。我尝试将引用单元格设置为中间查询列的值,并检查两者是否相等-不幸的是,数据刷新时会触发两次
工作表\u Change
事件

这让我抓狂。在成功刷新查询后,我只需要打印一张图表。

这对我很有用:

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

需要.refreshing属性的示例。