2

从外部源中选择数据
我有一个数据连接,它使用selectSQL 服务器的查询将数据检索到使用 vba 代码的 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

但只有在读取数据时
我怎么知道刷新何时完成获取所有数据?
我必须做什么才能UpdatePivot在刷新完成后才运行子程序而不求助于sleep黑客。

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

4

3 回答 3

2

这不是一个出色的解决方案,但您可以ActiveWorkbook.Connections("x").Refresh通过设置同步运行

.BackgroundQuery = False

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

于 2011-05-12T11:49:58.317 回答
1

.BackgroundQuery = False不会确保数据刷新后同步执行。

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

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

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

于 2012-07-16T16:00:49.357 回答
0

这对我有用:

Sheets("Sheet1").ListObjects(1).QueryTable.Refresh BackgroundQuery:=False
于 2021-04-28T17:01:44.403 回答