使用 VBA 刷新单个查询的最佳选择

Posted

技术标签:

【中文标题】使用 VBA 刷新单个查询的最佳选择【英文标题】:Best option to refresh a single query using VBA 【发布时间】:2020-05-05 07:26:44 【问题描述】:

我有一个包含 4-6 个查询的工作簿,我只想用 VBA 刷新 6 个查询中的 1 个。我的问题是,我使用的是下面最快的选项吗?

不,我不想在 Excel 中使用“全部刷新”/“刷新”按钮,我需要将其包含在一个子项中。

代码:

    ThisWorkbook.Connections("Query - Raw").OLEDBConnection.refresh

    ' THESE ALSO WORK
    ' ActiveWorkbook.RefreshAll
    ' Selection.ListObject.QueryTable.refresh BackgroundQuery:=False

这些不起作用:

    ActiveWorkbook.Connections("Raw").refresh
    ThisWorkbook.Connections("Raw").refresh

提前感谢您的友好回答。

【问题讨论】:

【参考方案1】:

最快的应该是按名称刷新特定查询。

ThisWorkbook.Connections("YourOLEDBconnection").OLEDBConnection.refresh

这将是一个较小的调用堆栈,但不会太多/如果有任何明显的时间差异。它也只关心连接打开、刷新、关闭路径。

类似:

ThisWorkbook.Worksheets("SheetName").ListObjects("query table name").QueryTable.refresh BackgroundQuery:=False 

我认为会有更长的调用堆栈对顶部显示的连接刷新进行额外调用。您也可能会产生与表格本身相关的少量开销(任何重新绘制的格式等)。

您可以对各种方法进行计时,并寻找最佳的中间刷新时间并采用该方法。

【讨论】:

与进入我需要刷新的工作表然后使用 VBA 代码运行 Selection.ListObject.QueryTable.refresh BackgroundQuery:=False 不同吗? ?我是说刷新表格会在后台刷新连接,所以只需刷新连接即可。 我的意思是 ThisWorkbook.Worksheets("SheetName").ListObjects("query table name").QueryTable.refresh BackgroundQuery:=False 与 Selection.ListObject.QueryTable.refresh BackgroundQuery:= 基本相同假的? 没有。第二个会产生更多的 i/o 开销,因为您必须先触摸工作表并选择目标。

以上是关于使用 VBA 刷新单个查询的最佳选择的主要内容,如果未能解决你的问题,请参考以下文章

使用 Access VBA,如何计算选择查询中的输出记录数并将计数存储为 VBA 变量?

Excel VBA - 将多个用户表单复选框值写入单个单元格

VBA-如何选择具有值的列单元格

持续刷新 HTML 表格 (SPA) 的最佳选择

当未从多个选择框之一中选择项目时,基于 Access 中的多个“多个选择列表框”的 VBA 查询

ACCESS VBA 从列表框中选择多个值并执行查询名称