2014-11-17 13 views
10

Ostatecznie chciałbym uruchomić makro po każdym odświeżeniu skoroszytu, szczególnie za pomocą przycisku Odśwież na karcie Dane w programie Excel. Na razie jednak byłbym usatysfakcjonowany po prostu wywołaniem zdarzeń BeforeRefresh lub AfterRefresh QueryTable po naciśnięciu przycisku Odśwież.Jak wywołać makro po naciśnięciu przycisku Odśwież lub Odśwież wszystko?

Oprócz „dokumentacji” oferowany na stronie internetowej Microsoft Dev Center, odpowiednie posty Przeczytałem jako część tego procesu badawczego należą:

Ja wyraźnie brakuje czegoś ważnego (i najprawdopodobniej oczywistego). Oto co mam do tej pory:

Pod Class Modules (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 

ramach modułu 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 

próbowałem odmiany drugim bloku kodu w określonych arkuszach, jak również , ale jeszcze nie znalazłem niczego, co działa. Czy muszę w jakiś sposób przyciemnić kwestionowaną tabelę QueryTable w module Arkusz roboczy? Wszelkie sugestie lub przemyślenia na temat tego, czego mi brakuje, będą bardzo mile widziane.

+2

Zwykle używam * zdarzenia PivotTableUpdate * w atrapie * tabeli przestawnej * ustawionej w atrapie ukrytego arkusza, aby odpalić makro, gdy użytkownik naciśnie przycisk * Odśwież wszystko *. Jeśli chodzi o twoje pytanie, myślę, że lepiej jest umieścić linię 'WithEvents' w * ThisWorkbook * (to, co nazywasz modułem ze skoroszytu), a następnie wystrzelić tam wydarzenie. – L42

+0

Doceniam sugestię - naprawdę o tym nie myślałem. Jest to trochę obejście i, szczerze mówiąc, trochę pokłóciłem się z wydarzeniem PivotTableUpdate, ale okazało się, że jest to problematyczne dla mojego przypadku użycia. Dzieki za sugestie. – circld

Odpowiedz

12

Właściwie nie podłączono querytable do instancji klasy. Revised 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 

kodu Nowy 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 

pamiętać, że jest dość ściśle sprzężone. Byłoby bardziej możliwe do ponownego wykorzystania, gdybyś podniósł zdarzenia w klasie i zadeklarował swoją zmienną WithEvents.

+1

Jesteś odrażającym bohaterem, dziękuję. Zarówno łączenie QueryTable z klasą, jak i przenoszenie Dim qtevent As qtClass poza procedurą były kluczowymi bitami, których mi brakowało. Zajrzę do twojej sugestii (teraz, gdy w końcu zadziała). Wielkie dzięki za zwięzłe, ale jasne wyjaśnienie. Twoje zdrowie. – circld

+0

Tak, wow. To jest dokładnie odpowiedź, a jednak są [so] (http://stackoverflow.com/questions/7040722) [many] (http://stackoverflow.com/questions/13407514) [odpowiedzi] (http: // stackoverflow .com/questions/22083668) [on] (http://stackoverflow.com/questions/8925403) [this] (http://stackoverflow.com/questions/14667035) [strona] (http://stackoverflow.com/questions/18136069), które nie zbliżają się do tej prostej precyzji. Spędziłem dwa dni szukając, skończyło się pisanie własnego [demo] (https://github.com/mcw0933/StackOverflowQuestion32974553/tree/master), zanim znalazłem to. Miły. – mcw0933

+0

Dzięki za pomoc - bardzo jasne wyjaśnienie! –