Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

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 would be satisfied just getting the BeforeRefresh or AfterRefresh QueryTable events to fire upon pressing the Refresh button.

In addition to the documentation on the Microsoft Dev Center website, the relevant posts I have read include:

  • Excel VBA - QueryTable AfterRefresh function not being called after Refresh completes
  • VBA For Excel AfterRefresh Event
  • There are other posts but I lack the reputation to post them.

Here is what I have:

Under 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

Under the ThisWorkbook module

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

I have tried variations of the second code block under specific worksheets as well, but have yet to find anything that works. Do I need to somehow dim the QueryTable in question in the Worksheet module?

like image 674
circld Avatar asked Nov 17 '14 22:11

circld


People also ask

How do you refresh all macros in Excel?

You can trigger the refreshing of your stock data by either using keyboard shortcut Ctrl+Alt+F5 or navigating to your Excel Ribbon's Data tab and clicking the Refresh All button within the Queries & Connections button group.

How do you trigger a macro when a cell value is changed?

Run Macro When a Cell Changes (Method 1)Go to the VBA Editor (Alt + F11) and double-click the name of the spreadsheet that contains the cell that will change or just right-click the worksheet tab and click View Code.


2 Answers

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.

like image 139
Rory Avatar answered Nov 09 '22 17:11

Rory


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
like image 36
FreeSoftwareServers Avatar answered Nov 09 '22 17:11

FreeSoftwareServers