首页 > 解决方案 > 按下“全部刷新”后如何运行 VBA 代码

问题描述

我在 AS/400 上创建了一个名为 SHIPVIEW 的 SQL 视图,然后我使用 ODBC 连接从 Excel 连接到该视图。

我还验证了如果视图中的数据发生更改并且我在 Excel 中的“数据”选项卡下按“全部刷新”,则 Excel 中的数据也正在正确更新。

我现在需要创建一些 VBA 代码,当打开工作簿或选择“全部刷新”时,它会启动 VBA 代码以对刚刚导入的数据进行一些计算。

我找到了下面的链接,但我没有任何运气让它工作。

https://stackoverflow.com/questions/29433281/refresh-all-pivot-tables-in-excel-workbook-using-vba-macro?r=SearchResults&s=2|99.4596

我是 VBA 的新手,所以欢迎任何答案!

标签: excelvba

解决方案


大概视图被转储到工作表上;Excel 为它创建一个可刷新QueryTable的对象,并且该QueryTable对象公开BeforeRefreshAfterRefresh您可以处理的事件。

这是通过WithEvents在类模块中声明适当类型的对象变量来完成的(WithEvents在标准过程模块中是非法的),然后WithEvents在左上角代码窗格下拉列表中选择变量,然后在顶部选择我们要处理的事件- 右下拉:

代码窗格下拉菜单在左侧显示事件提供程序,在右侧显示事件

假设该表在编译时存在于工作簿中(即它不是由其他一些 VBA 代码从头开始创建的),您可以在ThisWorkbook模块中有这样的内容:

Option Explicit
Private WithEvents QT As QueryTable

Private Sub QT_AfterRefresh(ByVal Success As Boolean)
    If Success Then
        'do stuff
    End If
End Sub

Private Sub Workbook_Open()
    Set QT = Sheet1.QueryTables(1) 'adjust accordingly
End Sub

如果它QueryTable是由其他代码在运行时产生的,那么您可以QT公开,并从负责创建它的代码中分配它。

请注意,无论 QT 如何刷新,这些 QueryTable 事件都会触发:无论是右键单击刷新该查询,还是单击“全部刷新”,都没有区别。


推荐阅读