Как вызвать макрос после нажатия кнопки "Обновить" или "Обновить все"?

В конечном счете, я хотел бы запустить макрос после того, как кто-нибудь обновит книгу, особенно используя кнопку "Обновить" на вкладке "Данные" в Excel. Однако пока я был бы доволен тем, что запускал события BeforeRefresh или AfterRefresh QueryTable, нажав кнопку "Обновить".

В дополнение к "документации", предлагаемой на веб-сайте Microsoft Dev Center, соответствующие сообщения, которые я прочитал как часть этого исследовательского процесса, включают:

Мне явно не хватает чего-то важного (и, скорее всего, очевидного). Вот что я до сих пор:

В модулях классов (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

Я также пробовал варианты второго кодового блока в определенных рабочих листах, но еще не нашел ничего, что сработает. Нужно ли мне как-то смущать вопрос QueryTable в модуле Worksheet? Любые предложения или мысли о том, что мне не хватает, будут с благодарностью.

Ответ 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

Новый код этой книги:

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.