How to call macro after Refresh or Refresh All button pressed?

前端 未结 2 1645

Ultimately, I would like to run a macro after anyone refreshes the workbook, specifically using the Refresh button under the Data tab in Excel.

For the time being, I

相关标签:
2条回答
  • 2020-12-09 05:07

    Source: https://www.excelandaccess.com/create-beforeafter-query-update-events/

    Class: Note: Class Name = clsQuery

    Option Explicit
    
    Public WithEvents MyQuery As QueryTable
    
    Private Sub MyQuery_AfterRefresh(ByVal Success As Boolean)
     If Success Then
      Debug.Print "After ReFresh"
     End If
    End Sub
    
    Private Sub MyQuery_BeforeRefresh(Cancel As Boolean)
     Debug.Print "Before ReFresh"
    End Sub
    

    Module:

    Option Explicit
    Dim colQueries As New Collection
    Sub InitializeQueries()
    
    Dim clsQ As clsQuery
    Dim WS As Worksheet
    Dim QT As QueryTable
    
    For Each WS In ThisWorkbook.Worksheets
     For Each QT In WS.QueryTables
      Set clsQ = New clsQuery
      Set clsQ.MyQuery = QT
      colQueries.Add clsQ
     Next QT
    Next WS
    
    End Sub
    

    ThisWorkbook.Event:

    Private Sub Workbook_Open()
     
     Call InitializeQueries
     
    End Sub
    
    0 讨论(0)
  • 2020-12-09 05:18

    You haven't actually connected the querytable to the class instance. 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
    

    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
    

    Note that this is quite closely coupled. It would be more re-usable if you were to raise events in the class and declare your qtevent variable WithEvents.

    0 讨论(0)
提交回复
热议问题