刷新工作簿中的所有查询

Sim*_*ris 2 excel vba excel-2007 excel-vba

这适用于.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
Run Code Online (Sandbox Code Playgroud)

编辑-所以看来我的语法确实刷新了.xlsx工作簿,但没有刷新来自sql server的查询。如何通过VBA刷新这些内容。

nek*_*tic 6

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

在Excel 2007和更高版本中,用户创建的与SQL Server数据源(以及其他)的外部数据连接将不会导致QueryTables成员,而是会导致ListObject拥有一个可通过该ListObject.QueryTable属性访问的QueryTable对象-请参阅Dick Kusleika的答案了这个问题。以下代码应刷新两种类型的查询:

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
Run Code Online (Sandbox Code Playgroud)

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