Challenge 3: An Unwrapped RefreshAll Meeting a Worksheet_Change Handler — Solution Walkthrough The unwrapped macro: Sub RefreshDashboard() ThisWorkbook.RefreshAll MsgBox "Dashboard refreshed — " & Format(Now, "dd mmm yyyy hh:nn") End Sub What could go wrong: ThisWorkbook.RefreshAll re-runs every query and PivotTable in the workbook, which writes new values into potentially hundreds of cells across the Dashboard sheet all at once. If a Worksheet_Change handler exists on that same sheet (from Chapter 8), EVERY one of those individual cell writes fires Worksheet_Change again, once per changed cell — not just once for the whole refresh, but potentially dozens or hundreds of times in rapid succession as the refresh proceeds. Depending on what that handler actually does (Chapter 8's own example wrote a flag into a neighbouring column whenever a value exceeded a threshold), this could mean the handler re-evaluates and re-writes across the sheet repeatedly during a single refresh, causing the exact kind of sluggishness or unresponsiveness Chapter 8's own troubleshooting exercise walked through — and, in the worst case, if any of those handler-triggered writes lands back in a cell the handler itself watches, a genuine runaway loop. The corrected macro: Sub RefreshDashboard() Application.EnableEvents = False ThisWorkbook.RefreshAll Application.EnableEvents = True MsgBox "Dashboard refreshed — " & Format(Now, "dd mmm yyyy hh:nn") End Sub WHY THIS WORKS AS AN ANSWER ------------------------------ Setting Application.EnableEvents to False before RefreshAll tells Excel to ignore every change event that RefreshAll's own writes would otherwise generate — the Worksheet_Change handler simply doesn't fire at all while the refresh is in progress, regardless of how many cells get rewritten. Setting it back to True immediately afterward restores normal behaviour, so the very next genuine user edit to the Dashboard sheet still triggers the handler exactly as intended. This is the exact same defensive pattern Chapter 8's own warning box (and its worked FlagOverspending example) already established — applied here around an entire RefreshAll operation instead of a single targeted cell write, because both are, at their core, the same risk: code writing to a sheet that's watching itself for changes.