用VBA刷新表格

我有两张表,一张带有城市列表(我们将称之为“城市列表”),另一张带有与这些城市相对应的数据点(称为数据表)。 数据表连接到我在MS SQL Server中构build的Select查询。 这个Select查询/数据表有一个Where子句,其中我已经replace了SQL条件并replace了一个? 以便在连接到Excel时使其成为参数。

现在我已经完成了,我会解释我想要完成的。 我想遍历城市列表,并为列表中的每个城市,更新数据表以反映城市的数据点。 最终,我想循环访问,每次刷新数据表时,都会将该工作簿的副本与该特定表保存在一起。

我已经把我现在的代码放在下面,但是我的问题是,这个表永远不会刷新与当前通过循环select的城市相对应的当前数据。 说到这里,如果我点击escape键来突破VBAmacros,那么在我停止macros之前,桌子会随着上一个城市的情况而刷新。

码:

 Sub Macro1() Dim WS As Worksheet Dim WS2 As Worksheet Dim CT As Variant Dim MSG As String Set WS = Sheets("Sheet1") Set WS2 = Sheets("Sheet2") CT = Range("A1").CurrentRegion For i = 2 To UBound(CT, 1) MSG = "" For J = 1 To UBound(CT, 2) WS.Range("$D$2").Value = CT(i, J) //Places the city into Cell $D$2 which is where The Data Table looks to for the parameter. Exit For Next J ActiveWorkbook.Connections("Query from Database").Refresh WS2.ListObjects(1).Refresh Next i End Sub 

就好像macros观运行速度太快,桌子不能赶上和刷新。 我已经尝试在代码中添加一些等待时间,希望能给它足够的时间来让表刷新,但这没有任何影响。 我也closures了“ Background Refresh ,但这似乎也没有做任何事情。 现在它只是遍历城市表格,每个城市都显示查询正在刷新,但查询完成刷新后,它将进入下一个城市,而不更新数据表。 帮帮我!

有一些事情我认为你需要做 – 也许你已经做了。

  1. 当你设置你的参数/绑定variables(你已经完成),把它指向一个特定的单元格。 然后,在您的SQL Server查询中,确保参数每次绑定到该范围:

在这里输入图像描述

原谅我,如果我夸大了显而易见的,但对于那些不知道你通过右键单击表并select表 – >参数进入该对话框。

  1. 从那里,当你迭代你的主表(带有城市的表)时,你可以从表中的每一行取值,并用绑定参数更新单元格。

像这样的东西应该工作:

 Sub RefreshAllCities() Dim ws1, ws2 As Worksheet Dim loCities, loDataTable As ListObject Dim lr As ListRow Set ws1 = ActiveWorkbook.Worksheets("Sheet1") Set ws2 = ActiveWorkbook.Worksheets("Sheet2") Set loCities = ws1.ListObjects("CityList") Set loDataTable = ws2.ListObjects("DataTable") ' get rid of those pesky warnings to overwrite files Application.DisplayAlerts = False For Each lr In loCities.ListRows ws2.Cells(1, 2).Value = lr.Range(1, 1).Value loDataTable.QueryTable.Refresh BackgroundQuery:=False ActiveWorkbook.SaveAs Filename:="C:\temp\" & lr.Range(1, 1).Value & ".xlsx", _ FileFormat:= xlOpenXMLWorkbook Next lr Application.DisplayAlerts = True End Sub 

我假设你在这个例子中需要.xlsx文件。 这将会打破任何embedded的VBA,这实际上是一个不错的奖励,因为过滤的数据集的接收者将不必暴露于此。 如果你想要xlsm或者xlsb ,那很容易改变。

默认情况下,Excel将“启用后台刷新”,这将允许Excel继续前进,并在查询刷新实际完成之前继续执行。 有些人可以通过调用.Refresh两次来获得它的工作,但它几乎是随机/任意的时间。

应该有一个Excel选项来取消选中数据表属性,或者您可以通过对VBA的引用来更新BackgroundQuery = False属性

如果禁用背景刷新,那么在继续之前,您的代码将静止并等待刷新完成。