The AfterCalculate event occurs when all pending refresh activity (both synchronous and asynchronous) and all of the resultant calculation activities have been completed.
expression A variable that represents an Application object.
This event occurs whenever calculation is completed and there are no outstanding queries. It's mandatory for both conditions to be met before the event occurs. The event can be raised even when there is no sheet data in the workbook, such as whenever calculation finishes for the entire workbook and there are no queries running.
Add-in developers use the AfterCalculate event to know when all the data in the workbook has been fully updated by any queries and/or calculations that may have been in progress.
This event occurs after all Worksheet.Calculate, Chart.Calculate, QueryTable.AfterRefresh, and SheetChange events. It's the last event to occur after all refresh processing and all calc processing have completed, and it occurs after CalculationState is set to xlDone.
Put the following code in the
ThisWorkbook object. Download This Example: Application AfterCalculate Event.
'-------------------- ThisWorkbook -------------------- Public WithEvents App As Application Private Sub Workbook_Open() Set App = Application End Sub Private Sub App_AfterCalculate() ' DO WHATEVER YOU WANT After Calculate. E.g., call a Public Sub. MsgBox "AfterCalculate called" Call RunAfterCalculate End Sub
If the AfterCalculate handler modifies anything in the spreadsheet then, in order to prevent unexpected repeated or recursive callbacks, I wrap it in an If statement to make sure it only runs once, as in the following
'-------------------- Module -------------------- Public RunningAfterCalculate As Boolean Public Sub RunAfterCalculate() If Not RunningAfterCalculate Then RunningAfterCalculate = True ' DO WHATEVER YOU WANT AfterCalculate ' ... MsgBox "Call RunAfterCalculate Once ..." RunningAfterCalculate = False End If End Sub
Note that if for some reason VBA encounters an unhandled exception you will have to reset the App – e.g. by running a sub like this:
Public Sub RestartEventHandler() Set ThisWorkbook.App = Application Application.EnableEvents = True RunningAfterCalculate = False End Sub
Another example: Excel Macro: Rename Worksheet Events in Excel