【问题标题】:Refresh All Queries in Workbook刷新工作簿中的所有查询
【发布时间】:2015-10-07 04:30:12
【问题描述】:

这适用于 .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 server 的查询。如何通过 VBA 刷新这些。

【问题讨论】:

  • 所以我检查了我的测试工作簿中的查询是否真的被刷新了,他们没有 - 请参阅我的答案的编辑。感谢您让我注意到这个怪癖!现在我得去检查一堆我自己的电子表格,看看我是否需要处理这个问题。

标签: vba excel excel-2007


【解决方案1】:

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

在 Excel 2007 及更高版本中,用户创建的与 SQL Server 数据源(以及其他)的外部数据连接将不会产生 QueryTables 成员,而是会产生一个 ListObject,该对象将拥有一个可通过 ListObject.QueryTable 访问的 QueryTable 对象财产 - 请参阅 Dick Kusleika 的 answerthis 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,这可能会导致上述错误代码 - 你可能需要检查一下。

【讨论】:

  • 是否可以迭代刷新所有工作表,而不是像示例所示那样指定工作表名称?
  • 小心。以上假设您的所有 ListObjects 都是“查询”类型。如果它们是“数据透视”类型,则当 Excel 是数据透视表对象时,您可能会导致 Excel 崩溃,迫使它认为它是 QueryTable 对象。我建议对 XlListObjectSourceType 值“3”进行测试以确定。只是一个想法。
【解决方案2】:

@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

【讨论】:

  • 这是更好和正确的答案,因为它会检查对象类型
【解决方案3】:

ActiveWorkbook.RefreshAll

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

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    • 2010-09-09
    相关资源
    最近更新 更多