我有两个表,一个带有城市列表(我们称之为城市列表),另一个表带有与这些城市对应的数据点(称为数据表)。数据表连接到我在MS SQL Server中构建的Select查询。此Select查询/数据表有一个Where
子句,我在其中替换了SQL条件并替换了?
,以便在连接到Excel时使其成为参数。
现在,我已经解决了这个问题,我将解释我想要完成的事情。我想遍历城市列表并列出列表中的每个城市,更新数据表以反映城市的数据点。最后,我想循环,每次刷新数据表时,它会保存该特定表的工作簿副本。
我已将我当前的代码发布到下面,但我的问题是该表永远不会刷新与当前通过循环选择的城市对应的当前数据。话虽如此,如果我按下escape
键以突破VBA宏,那么表格将在我停止宏之前刷新上一个城市。
代码:
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
这几乎就好像宏运行得太快,桌子无法赶上并刷新。我已经尝试在代码中添加一些等待时间,希望它能给它足够的时间让表刷新,但这没有任何影响。我也关掉了Background Refresh
,这似乎也没有做任何事情。现在它只是循环遍历城市表,并且每个城市都显示查询是刷新的,但在查询完成刷新后,它会进入下一个城市,而不会更新数据表。帮助!
答案 0 :(得分:3)
我认为你需要做几件事 - 也许你已经完成了它们。
请原谅我,如果我夸大显而易见的事情,但对于那些不知道你通过右键单击表格并选择表格 - >参数的人来到这个对话框。
这样的事情应该有效:
class Base {
protected:
pthread_t receiverThreadID;
Base() {}
~Base() {}
void start() {
pthread_create(&receiverThreadID,NULL,threadFunction,this);
}
...
};
我假设您在此示例中需要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
个文件。这将破坏任何嵌入式VBA,这实际上是一个很好的奖励,因为过滤数据集的接收者不必暴露于此。如果您想要.xlsx
或xlsm
,那么这很容易改变。
答案 1 :(得分:1)
默认情况下,Excel将"启用后台刷新"这将允许Excel继续执行并在查询刷新实际完成之前继续执行。有些人可以通过拨打.Refresh
两次来使其工作,但它几乎是随机/随意的时间。
在数据表属性中应该有一个Excel选项取消选中,或者您可以通过对它的引用来更新VBA中的BackgroundQuery = False属性
如果您禁用后台刷新,那么您的代码将会等待刷新完成后再继续。