按下“刷新”或“全部刷新”button后如何调用macros?

最后,我想在任何人刷新工作簿后运行一个macros,特别是使用Excel中“数据”选项卡下的“刷新”button。 但是,暂时,我会满意只是得到BeforeRefresh或AfterRefresh QueryTable事件按下刷新button时触发。

除了在微软开发中心网站上提供的“文档”外,我作为研究过程的一部分阅读的相关文章包括:

  • Excel VBA – QueryTable刷新完成后,不会调用AfterRefresh函数
  • Excel AfterRefresh事件的VBA
  • 还有其他不太有用的或相关的post,但我缺乏声誉在这里发布。

我显然错过了一些重要的(很可能是显而易见的)。 这是我到目前为止:

在类模块(qtclass)下

Option Explicit Private WithEvents qt As Excel.QueryTable Private Sub qt_AfterRefresh(ByVal Success As Boolean) MsgBox "qt_AfterRefresh called sucessfully." If Success = True Then Call Module2.SlicePivTbl MsgBox "If called succesfully." End If End Sub Private Sub qt_BeforeRefresh(Cancel As Boolean) MsgBox "qt_BeforeRefresh called." End Sub 

在ThisWorkbook模块下

 Private Sub Workbook_Open() Dim qtevent As qtclass Dim qt As QueryTable Set qt = ThisWorkbook.Worksheets("Data-Fund").ListObjects(1).QueryTable Set qtevent = New qtclass End Sub 

我已经尝试了特定工作表下的第二个代码块的变体,但还没有find任何可行的方法。 我是否需要以某种方式调暗工作表模块中的QueryTable? 任何build议或想法,我失踪将不胜感激。

你实际上没有将查询表连接到类实例。 修改了qtclass

 Option Explicit Private WithEvents qt As Excel.QueryTable Public Property Set HookedTable(q As Excel.QueryTable) Set qt = q End Property Private Sub qt_AfterRefresh(ByVal Success As Boolean) MsgBox "qt_AfterRefresh called sucessfully." If Success = True Then Call Module2.SlicePivTbl MsgBox "If called succesfully." End If End Sub Private Sub qt_BeforeRefresh(Cancel As Boolean) MsgBox "qt_BeforeRefresh called." End Sub 

新的ThisWorkbook代码:

 Dim qtevent As qtclass Private Sub Workbook_Open() Set qtevent = New qtclass Set qtevent.HookedTable = ThisWorkbook.Worksheets("Data-Fund").ListObjects(1).QueryTable End Sub 

请注意,这是非常紧密的联系。 如果你要在类中引发事件并声明你的qteventvariablesWithEvents,那将更加可重用。