【问题标题】:Resize dynamically a table as another in VBA after Connection.Refresh- excel在 Connection.Refresh-excel 之后,在 VBA 中动态调整表的大小
【发布时间】:2016-05-05 09:21:32
【问题描述】:

我正在使用 Excel 2007,我在同一个工作表中有两个表,比如说 tab1tab2tab1 通过与 MS-SQL 服务器的连接填充,tab2 包含一些引用 tab1 单元格的公式,我用它来创建一些对图表和其他东西有用的值。问题是每次刷新数据连接时 tab1 都会更改它的行数,我希望 tab2 能够反映这种变化。
我尝试使用 OFFSET 函数并引用 tab1 来声明 tab2 的范围,这在声明期间有效,但是当 tab1 更改时, tab2 不要...所以我认为表格声明中指定的范围不能动态更改。
由于我通过 VBA 刷新了填充 tab1 的连接数据,因此我尝试使用 VBA 调整 tab2 的大小。我做这样的事情:

With ActiveWorkbook.Connections("conn_name")
   .OLEDBConnection.CommandText = query 'query previously set
   .Refresh
End With
range_calculated = ....
' MsgBox range_calculated
With ActiveWorkbook.WorkSheets(name_sheet)
   .ListObjects(name_table_to_refresh).Resize Range(range_calculated)
End With

为了找到 tab2 的最后一行,我使用了这样的东西:

last_row_tab2 = .ListObjects("tab1").range.Rows.Count + .ListObjects("tab1").range.Row - 1

对于第一列和最后一列以及第一行,我使用了类似的东西。

现在,Connection.Refresh 起作用了,因为 tab1 改变了它的值并且一切正常(表格改变了它的行数),但是当我做 @ 987654324@ 方法无法按预期工作。我放了一个MsgBox 来捕获计算的范围,我注意到看起来像这样的Refresh 方法或 tab1 的“刷新”,其中导入了新数据,它在Sub 的结尾,而不是当我在代码中触发 Refresh 时。我怀疑这是因为 MsgBox 中显示的范围始终是 Refresh 的前一个,因此反映了 Refresh 之前 tab1 的实际大小.例如,如果现在 tab1 在第 10 行结束并且我触发了宏,则 MsgBox 显示为 10,但在刷新后表格结束到第 15 行;如果我再次触发宏,MsgBox 会显示 15,但刷新后表格结束到第 12 行......等等。
我错过了什么?
这是我想出相应地调整 tab2 大小的唯一方法 tab1

编辑:
我还尝试将Resize 部分放在另一个子中,并在Refresh 之后调用此子,但没有任何变化。

任何帮助表示赞赏

埃托雷

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    我终于找到了问题并希望分享解决方案。
    事实上,Refresh 在 VBA 代码中触发时并未执行,但后来,这是因为我正在刷新的连接的选项启用后台刷新已启用。禁用此选项允许 VBA 代码立即执行查询(来自Office support):

    启用后台刷新 选中此复选框可在后台运行查询。清除此复选框可在您等待时运行查询。在后台运行查询使您可以在查询运行时使用 Excel。

    所以,禁用该选项解决了问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-26
      • 2018-10-21
      相关资源
      最近更新 更多