Как вызвать макрос после нажатия кнопки "Обновить" или "Обновить все"?
В конечном счете, я хотел бы запустить макрос после того, как кто-нибудь обновит книгу, особенно используя кнопку "Обновить" на вкладке "Данные" в 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.