这适用于.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刷新它们。
答案 0 :(得分:3)
首先,没有宏可以在.xlsx
工作簿中使用,因为.xlsx工作簿不能包含宏 - 您需要另存为启用宏的工作簿,其中包含扩展名.xlsm
。
在Excel 2007及更高版本中,用户创建到SQL Server数据源(以及其他数据源)的外部数据连接将不会出现在QueryTables成员中,而是出现在ListObject中,该对象将拥有可通过{{1访问的} QueryTable对象}} - 请参阅Dick Kusleika的answer到this 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的对象在后台刷新