刷新工作簿中的所有查询

Refresh All Queries in Workbook

这适用于 .xls 书籍,但是否也可以针对 .xlsx 工作簿进行更改?还是它们的语法对两者都适用?

Option Explicit
Public Sub RefreshQueries()
  Dim wks As Worksheet
  Dim qt As QueryTable
  For Each wks In Worksheets
    For Each qt In wks.QueryTables
        qt.Refresh BackgroundQuery:=False
    Next qt
  Next wks
  Set qt = Nothing
  Set wks = Nothing
End Sub

编辑 -- 所以看起来我的语法确实刷新了 .xlsx 工作簿,但不是来自 sql 服务器的查询。如何通过 VBA.

刷新这些内容

首先,没有宏在 .xlsx 工作簿中起作用,因为 .xlsx 工作簿不能包含宏 - 您需要另存为 启用宏的工作簿 具有扩展名 .xlsm

在 Excel 2007 年及以后,用户创建到 SQL 服务器数据源(以及其他数据源)的外部数据连接将不会生成 QueryTables 成员,而是生成一个拥有 QueryTable 的 ListObject可以通过 ListObject.QueryTable 属性 访问的对象 - 参见 Dick Kusleika 的 answer to this question。以下代码应刷新两种类型的查询:

Option Explicit
Public Sub RefreshQueries()

  Dim wks As Worksheet
  Dim qt As QueryTable
  Dim lo As ListObject

  For Each wks In Worksheets
    For Each qt In wks.QueryTables
        qt.Refresh BackgroundQuery:=False
    Next qt

    For Each lo In wks.ListObjects
        lo.QueryTable.Refresh BackgroundQuery:=False
    Next lo

  Next wks

  Set qt = Nothing
  Set wks = Nothing
End Sub

我以前不熟悉 ListObject 类型,所以我不知道您是否可以在没有 QueryTable 的工作表上使用 ListObject,这可能会导致上述代码出错 - 您可能需要检查一下。

@nekomatic 的回答为我抛出错误 1004(尽管它显然对其他人有效)。我改用这个:

Public Sub RefreshAllQueries()
    ' Refresh all queries (tables querying data from another source).

    Dim iWorksheet As Excel.Worksheet
    Dim iTable As Excel.ListObject
    Dim iQueryTable As Excel.QueryTable

    ' Check each worksheet.
    For Each iWorksheet In Excel.ActiveWorkbook.Worksheets

        ' Check each table.
        For Each iTable In iWorksheet.ListObjects

            If iTable.SourceType = Excel.XlListObjectSourceType.xlSrcQuery Then
                ' Table is a query table.
                With iTable.QueryTable
                    .BackgroundQuery = False    ' setting to wait for query to refresh
                    .Refresh
                End With

            End If

        Next iTable


        For Each iQueryTable In iWorksheet.QueryTables
            iQueryTable.Refresh BackgroundQuery:=False  ' wait for query to refresh
        Next iQueryTable

    Next iWorksheet
End Sub

ActiveWorkbook.RefreshAll

BackgroundQuery 属性 设置为 True 的对象在后台刷新