【问题标题】:How to call macro after Refresh or Refresh All button pressed?按下刷新或全部刷新按钮后如何调用宏?
【发布时间】:2014-11-17 22:19:37
【问题描述】:

最终,我想在任何人刷新工作簿后运行宏,特别是使用 Excel 中“数据”选项卡下的“刷新”按钮。

目前,我会满足于在按下刷新按钮时触发 BeforeRefresh 或 AfterRefresh QueryTable 事件。

除了微软开发中心网站上的文档,我看过的相关帖子还有:

这是我所拥有的:

类模块下(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

我也在特定工作表下尝试了第二个代码块的变体,但还没有找到任何可行的方法。我是否需要在 Worksheet 模块中调暗相关的 QueryTable?

【问题讨论】:

  • 我通常在一个虚拟的数据透视表中使用PivotTableUpdate事件,当用户按下全部刷新按钮。至于您的问题,我认为您最好将 WithEvents 行放在 ThisWorkbook (您称之为工作簿模块)中,然后在那里触发事件。
  • 欣赏这个建议——还真没想到。这是一种解决方法,老实说,我稍微摆弄了 PivotTableUpdate 事件,但发现它对我的用例有问题。感谢您的建议。

标签: excel vba


【解决方案1】:

您实际上还没有将查询表连接到类实例。 修改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

请注意,这是非常紧密耦合的。如果您要在类中引发事件并声明您的 qtevent 变量 WithEvents,它将更可重用。

【讨论】:

  • 你是个了不起的英雄,谢谢。将 QueryTable 链接到类和将 Dim qtevent As qtClass 移动到过程之外都是我缺少的关键位。我会看看你的建议(现在它终于奏效了)。非常感谢简洁但清晰的解释。干杯。
  • 是的,哇。这正是答案,但还有somanyanswersonthissite没有接近这个简单的精度。花了两天时间寻找,最后写了我自己的demo,在我找到这个之前。不错。
  • 救命稻草。这很有帮助。
【解决方案2】:

来源:https://www.excelandaccess.com/create-beforeafter-query-update-events/

类: 注意:类名 = clsQuery

Option Explicit

Public WithEvents MyQuery As QueryTable

Private Sub MyQuery_AfterRefresh(ByVal Success As Boolean)
 If Success Then
  Debug.Print "After ReFresh"
 End If
End Sub

Private Sub MyQuery_BeforeRefresh(Cancel As Boolean)
 Debug.Print "Before ReFresh"
End Sub

模块:

Option Explicit
Dim colQueries As New Collection
Sub InitializeQueries()

Dim clsQ As clsQuery
Dim WS As Worksheet
Dim QT As QueryTable

For Each WS In ThisWorkbook.Worksheets
 For Each QT In WS.QueryTables
  Set clsQ = New clsQuery
  Set clsQ.MyQuery = QT
  colQueries.Add clsQ
 Next QT
Next WS

End Sub

ThisWorkbook.Event:

Private Sub Workbook_Open()
 
 Call InitializeQueries
 
End Sub

【讨论】:

    猜你喜欢
    • 2011-11-24
    • 2018-09-30
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多