【问题标题】:Refreshing Structured Tables with VBA Loop使用 VBA 循环刷新结构化表
【发布时间】:2016-02-13 05:26:13
【问题描述】:

我有两张表,一张只是位置列表,另一张是通过 MS Query 查询连接到数据库的结构化数据表。在我的结构化数据表中,我有一个从位置列表中提取的参数设置,每次将新位置输入参数并刷新数据表时,我应该根据新位置获取一组新数据。

我正在尝试构建的是一个 VBA 循环,它遍历每个位置,通过参数将该位置提供给数据表,然后刷新数据表以反映更改。最终每次刷新后,我想将新的数据表保存在它自己的工作簿中,但我必须爬才能走路,所以我只解决刷新问题。

这是我尝试过的:

Sub Macro1()
Dim WS As Worksheet 
Dim CT As Variant
Dim MSG As String

Set WS = Sheets("Sheet1")

CT = Range("A1").CurrentRegion
For i = 2 To UBound(CT, 1)
    MSG = ""
    For J = 1 To UBound(CT, 2)
        Range("$D$2").Value = CT(i, J)

        ActiveWorkbook.Connections("Query from Database").Refresh
        Sheets("Sheet2").Select
          Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False

    Next J



Next i
End Sub

这导致我在数据表中的一些数据闪烁,但没有改变。

我也尝试只刷新连接而不是整个表,这似乎可以很好地刷新连接,但显然没有更新数据表。如何让表格本身在每个循环中刷新?

编辑:

基于更多的修补,我重做了上面的一些代码,但我仍然收到一些问题。代码循环遍历位置列表,并将当前位置放置在第一个工作表的单元格 $D$2 中(紧邻位置列表)。从这里开始,数据库查询和表应该刷新,但是当我通过点击转义符跳出 VBA 代码时,表只显示刷新结果。例如,它将遍历列表,循环的每次迭代都会在单元格 $D$2 中放置一个新位置,每次迭代数据表都应根据 $D$2 中的值刷新。发生的情况是 $D$2 在每个循环中都填充了一个新值,但是数据表只是保持空白,如果我按转义键停止宏,数据表将填充 $D$2 中最后一个值。每次循环后如何让数据表刷新?

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)

    Exit For


    Next J

        ActiveWorkbook.Connections("Query from Database").Refresh

          WS2.ListObjects(1).Refresh

Next i
End Sub

【问题讨论】:

  • 手动刷新时参数如何传入查询中?
  • @ScottHoltzman 每次我遍历位置列表时,它都会将当前位置名称放在列表旁边的单元格中。从这里数据表查看该单元格的参数值。如果我手动点击刷新,该单元格中的任何位置都会导致数据表相应地刷新。

标签: vba excel


【解决方案1】:

代码的问题在于,当您使用父对象时,您没有设置任何对父对象的特定引用。

特别是您可能认为此语句Range("$D$2").Value = CT(i, J) 作用于您桌子旁边的单元格,但它作用于目前活动的任何工作表。

试试这个代码。我可能会根据您的具体情况对具体任务进行一些调整,但如果您进行任何必要的调整,整体概念应该可以帮助您完成。

Sub Macro1()

Dim WS As Worksheet 
Dim WS2 as Worksheet
Dim CT As Variant

Set WS = Sheets("Sheet1")
Set WS2 = Sheets("Sheet2")

CT = WS.Range("A1").CurrentRegion

For i = 2 To UBound(CT, 1)

    For J = 1 To UBound(CT, 2)

        With WS2
            .Range("$D$2").Value = CT(i, J)
            .ListObjects(1).Refresh
        End With

    Next J

Next I

End Sub

【讨论】:

  • 感谢您的回复。我已经对代码进行了更多尝试,并添加了您建议的一些元素,但我仍然遇到了一些问题。查看我更新的答案以获取更多详细信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-22
  • 1970-01-01
  • 2016-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多