使用VBA刷新表

时间:2016-02-17 16:37:28

标签: excel vba excel-vba

我有两个表,一个带有城市列表(我们称之为城市列表),另一个表带有与这些城市对应的数据点(称为数据表)。数据表连接到我在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,这似乎也没有做任何事情。现在它只是循环遍历城市表,并且每个城市都显示查询是刷新的,但在查询完成刷新后,它会进入下一个城市,而不会更新数据表。帮助!

2 个答案:

答案 0 :(得分:3)

我认为你需要做几件事 - 也许你已经完成了它们。

  1. 设置参数/绑定变量(已完成)时,将其指向特定单元格。然后,在SQL Server查询中,确保每次都将参数绑定到该范围:
  2. enter image description here

    请原谅我,如果我夸大显而易见的事情,但对于那些不知道你通过右键单击表格并选择表格 - >参数的人来到这个对话框。

    1. 从那里开始,当您遍历主表(包含其中城市的表)时,您可以从该表中的每一行获取值,并使用绑定参数更新单元格。
    2. 这样的事情应该有效:

      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,这实际上是一个很好的奖励,因为过滤数据集的接收者不必暴露于此。如果您想要.xlsxxlsm,那么这很容易改变。

答案 1 :(得分:1)

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

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

如果您禁用后台刷新,那么您的代码将会等待刷新完成后再继续。