【问题标题】:Code to execute when ActiveWorkbook.Connections("x").Refresh is finishedActiveWorkbook.Connections("x").Refresh 完成时执行的代码
【发布时间】:2011-08-24 00:00:48
【问题描述】:

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

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

【问题讨论】:

    标签: sql-server excel remote-connections vba


    【解决方案1】:

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

    .BackgroundQuery = False
    

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

    【讨论】:

    • 需要一个 .refreshing 属性的例子。
    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      这对我有用:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-08
        • 2014-10-27
        • 2017-08-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多