excel - 按下“全部刷新”后如何运行 VBA 代码
问题描述
我在 AS/400 上创建了一个名为 SHIPVIEW 的 SQL 视图,然后我使用 ODBC 连接从 Excel 连接到该视图。
我还验证了如果视图中的数据发生更改并且我在 Excel 中的“数据”选项卡下按“全部刷新”,则 Excel 中的数据也正在正确更新。
我现在需要创建一些 VBA 代码,当打开工作簿或选择“全部刷新”时,它会启动 VBA 代码以对刚刚导入的数据进行一些计算。
我找到了下面的链接,但我没有任何运气让它工作。
我是 VBA 的新手,所以欢迎任何答案!
解决方案
大概视图被转储到工作表上;Excel 为它创建一个可刷新QueryTable
的对象,并且该QueryTable
对象公开BeforeRefresh
和AfterRefresh
您可以处理的事件。
这是通过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 事件都会触发:无论是右键单击刷新该查询,还是单击“全部刷新”,都没有区别。
推荐阅读
- excel - 范围快照作为弹出窗口
- java - Jackson,如何使用原始类型将 json 转换为 Java 类?
- azure - Azure DevOps 部署到本地计算机
- python - 熊猫中 for 循环的矢量化
- c++ - 在c ++中逐行拆分段落
- javascript - how to run a function when context changes in react
- c++ - How do you use the MySQL Connector/C++ and XDevAPI while using XAMPP to run MySQL?
- swift - Passing Index of a selected row to another ViewController
- c# - Azure 媒体服务作业长时间处于处理状态
- c - 为子类添加额外的“方法”