【问题标题】:How to run VBA code after the "Refresh All" is pressed按下“全部刷新”后如何运行 VBA 代码
【发布时间】:2021-02-17 16:15:49
【问题描述】:

我在 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 新手,欢迎任何答案!

【问题讨论】:

  • 您找到的链接用于触发刷新,而不是监听它。

标签: excel vba


【解决方案1】:

大概视图被转储到工作表上; 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 事件都会触发:无论是右键单击刷新该查询,还是单击“全部刷新”,都没有区别。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    • 2014-07-09
    • 2018-03-22
    • 1970-01-01
    相关资源
    最近更新 更多