2014-11-17 4 views
10

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

+2

Обычно я использую * PivotTableUpdate Event * в манекене * сводная таблица *, созданная в скрытом скрытом листе для запуска макроса, когда пользователь нажимает кнопку * Обновить все *. Что касается вашего вопроса, я думаю, вам лучше положить строку 'WithEvents' в * ThisWorkbook * (то, что вы называете модулем книги), а затем запустить там событие. – L42

+0

Цените предложение - не думал об этом. Это немного обходное решение, и, честно говоря, я немного поиграл с событием PivotTableUpdate, но нашел его проблематичным для моего варианта использования. Спасибо за предложение. – circld

ответ

12

Вы фактически не подключили таблицу запросов к экземпляру класса. Пересмотренный 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 

код New 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 

Обратите внимание, что это довольно тесно связаны между собой. Это было бы более пригодным для повторного использования, если бы вы поднимали события в классе и объявляли свою переменную ctevent WithEvents.

+1

Ты волшебный герой, спасибо. Оба связывания QueryTable с классом и перемещение Dim qtevent As qtClass вне процедуры были критическими битами, которые я отсутствовал. Я рассмотрю ваше предложение (теперь, когда оно наконец работает). Большое спасибо за краткое, но кристально чистое объяснение. Приветствия. – circld

+0

Да, ничего себе. Это точно ответ, и все же есть [так] (http://stackoverflow.com/questions/7040722) [много] (http://stackoverflow.com/questions/13407514) [ответы] (http: // stackoverflow .com/questions/22083668) [on] (http://stackoverflow.com/questions/8925403) [this] (http://stackoverflow.com/questions/14667035) [сайт] (http://stackoverflow.com/questions/18136069), которые не приближаются к этой простой точности. Я потратил два дня на поиски, в итоге написал свой собственный [demo] (https://github.com/mcw0933/StackOverflowQuestion32974553/tree/master), прежде чем нашел это. Ницца. – mcw0933

+0

Спасибо за помощь - очень четкое объяснение! –

Смежные вопросы