刷新工作簿中的所有查询

时间:2015-07-17 12:38:54

标签: vba excel-vba excel-2007 excel

这适用于.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刷新它们。

3 个答案:

答案 0 :(得分:3)

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

在Excel 2007及更高版本中,用户创建到SQL Server数据源(以及其他数据源)的外部数据连接将不会出现在QueryTables成员中,而是出现在ListObject中,该对象将拥有可通过{{1访问的} QueryTable对象}} - 请参阅Dick Kusleika的answerthis question。以下代码应刷新两种类型的查询:

ListObject.QueryTable

我之前并不熟悉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 1}},这可能会导致上述代码出错 - 您可能需要检查一下。

答案 1 :(得分:0)

@nekomatic的答案为我抛出错误1004(虽然它显然适用于其他人)。我改用它:

Option Explicit

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

    Dim shtSheetIter As Worksheet
    Dim qtbTableIter As QueryTable
    Dim lobTableIter As ListObject

    For Each shtSheetIter In ActiveWorkbook.Worksheets

        For Each lobTableIter In shtSheetIter.ListObjects
            If lobTableIter.SourceType = 3 Then
                With lobTableIter.QueryTable
                    .BackgroundQuery = False
                    .Refresh
                End With
            End If
        Next lobTableIter

        For Each qtbTableIter In shtSheetIter.QueryTables
            qtbTableIter.Refresh BackgroundQuery:=False
        Next qtbTableIter

    Next shtSheetIter

    Set qtbTableIter = Nothing
    Set shtSheetIter = Nothing

End Sub

答案 2 :(得分:-1)

ActiveWorkbook.RefreshAll

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