2014-11-17 6 views
10

Schließlich möchte ich ein Makro ausführen, nachdem jeder die Arbeitsmappe aktualisiert, insbesondere mit der Schaltfläche Aktualisieren in Excel auf der Registerkarte Daten. Vorläufig wäre ich jedoch zufrieden damit, dass die Ereignisse BeforeRefresh oder AfterRefresh QueryTable ausgelöst werden, wenn die Schaltfläche Aktualisieren gedrückt wird.So rufen Sie das Makro nach dem Aktualisieren oder Aktualisieren auf Alle Taste gedrückt?

Neben dem auf dem Microsoft Dev Center-Website angeboten ‚Dokumentation‘, die entsprechenden Beiträge, die ich im Rahmen dieses Forschungsprozesses gelesen haben, gehören:

Ich vermisse eindeutig etwas Wichtiges (und am ehesten offensichtlich). Hier ist, was ich habe bisher:

Unter Klassenmodule (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 

Unter dem Thisworkbook-Modul

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 

ich versucht habe, Variationen des zweiten Codeblock unter bestimmten Arbeitsblätter als auch , aber habe noch nichts gefunden, was funktioniert. Muss ich das betreffende QueryTable im Worksheet-Modul irgendwie dimmen? Irgendwelche Vorschläge oder Gedanken zu dem, was ich vermisse, wären sehr willkommen.

+2

Normalerweise verwende ich * PivotTableUpdate Event * in einem Dummy * Pivot Table * in einem versteckten Dummy-Blatt eingerichtet, um ein Makro zu starten, wenn ein Benutzer die Taste * Alle aktualisieren * drückt. Was deine Frage anbelangt, denke ich, dass es besser ist, die 'WithEvents'-Zeile in * ThisWorkbook * (was du Arbeitsbuch-Modul nennst) zu setzen und dann das Ereignis dort abzufeuern. – L42

+0

Schätzen Sie den Vorschlag - hatte nicht wirklich daran gedacht. Es ist eine Art Workaround und um ehrlich zu sein, habe ich mit dem PivotTableUpdate-Ereignis ein bisschen herumgespielt, aber es war problematisch für meinen Anwendungsfall. Danke für den Vorschlag. – circld

Antwort

12

Sie haben die Abfragetabelle nicht wirklich mit der Klasseninstanz verbunden. Überarbeitete 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-Code:

Dim qtevent As qtclass 
Private Sub Workbook_Open() 

    Set qtevent = New qtclass 
    Set qtevent.HookedTable = ThisWorkbook.Worksheets("Data-Fund").ListObjects(1).QueryTable 

End Sub 

Beachten Sie, dass dies ganz eng gekoppelt. Es wäre wiederverwendbarer, wenn Sie Ereignisse in der Klasse auslösen und Ihre qtevent-Variable WithEvents deklarieren würden.

+1

Du bist ein verdammter Held, danke. Sowohl die Verknüpfung der QueryTable mit der Klasse als auch die Verschiebung der Dim qtevent As qtClass außerhalb der Prozedur waren die kritischen Bits, die mir fehlten. Ich werde einen Blick in Ihren Vorschlag (jetzt, da es endlich funktioniert). Vielen Dank für die präzise, ​​aber kristallklare Erklärung. Prost. – circld

+0

Ja, wow. Das ist genau die Antwort und doch gibt es [so] (http://stackoverflow.com/questions/7040722) [viele] (http://stackoverflow.com/questions/13407514) [Antworten] (http: // stackoverflow .com/questions/22083668) [auf] (http://stackoverflow.com/questions/8925403) [dies] (http://stackoverflow.com/questions/14667035) [site] (http://stackoverflow.com)/questions/18136069), die dieser einfachen Präzision nicht nahe kommen. Habe zwei Tage damit verbracht, zu suchen, habe meine eigene [Demo] geschrieben (https://github.com/mcw0933/StackOverflowQuestion32974553/tree/master), bevor ich das gefunden habe. Nett. – mcw0933

+0

Danke für die Hilfe - sehr klare Erklärung! –

Verwandte Themen