When Excel freezes, crashes, or halts with Runtime Error 28: Out of stack space inside a worksheet module, your macro is likely caught in an event cascade. This occurs when an event handler (such as Worksheet_Change) modifies a cell on the worksheet. Modifying that cell triggers a new Worksheet_Change event before the first one finishes, causing an infinite loop that exhausts Excel’s call stack.
Quick Answer
Set
Application.EnableEvents = Falsebefore writing values to cells inside worksheet event procedures, and setApplication.EnableEvents = Trueat the end of the procedure. Always use anOn Error GoToblock so that runtime errors do not leave events permanently disabled.
The Event Cascade Trap Explained
Worksheet events are automated triggers. When you write code inside Worksheet_Change, Excel listens for any content change on that sheet. If your procedure formats a value, inserts a timestamp, or calculates a summary, that code write counts as a content change.
Without suppression, the execution flow spirals:
User edits Cell A1
│
▼
Worksheet_Change fires
│
├─ Code writes timestamp to Cell B1
│ │
│ ▼
│ Worksheet_Change fires (Call 2)
│ │
│ ├─ Code writes timestamp to Cell B1
│ │ │
│ │ ▼
│ │ Worksheet_Change fires (Call 3) ──> Recursion continues until crash
Each recursive call reserves space in Excel’s internal execution stack. Within milliseconds, the stack overflows, triggering Runtime Error 28: Out of stack space (Recursive loops gone wrong) or freezing the interface completely.
First-Line Fix: The Safe Event Suppression Pattern
To break the chain, disable event listening before modifying the grid, and restore it once the changes are written. Because unexpected runtime errors can bypass normal cleanup, always route execution through an error handler:
Private Sub Worksheet_Change(ByVal Target As Range)
' 1. Only monitor specific cells to avoid unnecessary execution
If Intersect(Target, Me.Range("A2:A100")) Is Nothing Then Exit Sub
If Target.Cells.CountLarge > 1 Then Exit Sub ' Skip bulk pastes
' 2. Route errors to guaranteed cleanup
On Error GoTo CleanExit
' 3. Suppress secondary events
Application.EnableEvents = False
' ----------------------------------------------------
' Safe modification area: changes here will not re-trigger this macro
Target.Offset(0, 1).Value = Now
Target.Offset(0, 1).NumberFormat = "yyyy-mm-dd hh:mm:ss"
' ----------------------------------------------------
CleanExit:
' 4. Always restore events
Application.EnableEvents = True
If Err.Number <> 0 Then
MsgBox "Event error: " & Err.Description, vbExclamation, "Macro Error"
End If
End Sub
What Happens When EnableEvents Stays False
Application.EnableEvents is a global application setting, not a workbook-level setting. If your code halts while EnableEvents = False (for example, if an unhandled error occurs or you click Reset in the VBA Editor), all events stop working across all open workbooks.
Common Symptoms of Disabled Events:
Worksheet_ChangeandWorksheet_Calculateno longer run.- Workbook open events (
Workbook_Open) fail to execute. - Form buttons and ActiveX controls appear unresponsive.
- Excel stops prompting before closing unsaved workbooks.
Restoring Events Immediately
If events stop firing after a macro crash, open the Immediate Window (Ctrl + G in the Visual Basic Editor), type the following line, and press Enter:
Application.EnableEvents = True
If your macro also altered display settings or calculation modes, restore all application states at once using Building a “Reset” macro to fix Excel settings after a crash (Calculation, ScreenUpdating).
Advanced Event Diagnostics: Beyond Basic Cell Edits
If your macro still loops or freezes after adding Application.EnableEvents = False, check these common architectural issues:
1. Cross-Sheet and Cross-Workbook Event Loops
Disabling events on the active sheet does not isolate procedures if code triggers external calculations. For example, editing Sheet1 might force a recalculation on Sheet2, which fires Worksheet_Calculate on Sheet2. If Sheet2’s calculation procedure edits Sheet1, the loop continues across modules.
- The Diagnostic: Disable both events and automatic calculation if your macros trigger cross-sheet dependencies. See Handling “ScreenUpdating” and “Calculation” mode freezes.
2. UserForm Control Event Recursion
Application.EnableEvents controls Excel application events, but it does not affect MSForms UserForm controls.
- If modifying
TextBox1.Textinside a UserForm triggersTextBox1_Change, settingApplication.EnableEvents = Falsewill not stop it. - The Fix: Use a module-level Boolean variable (e.g.,
Private isUpdating As Boolean) to track and block internal form updates.
3. Long Loops Triggering Background Resource Limits
If an event macro runs on every cell during a bulk paste, it can exhaust system resources even without infinite recursion. Wrap bulk modifications in array operations, and reference Troubleshooting “Out of Resources” during massive VBA loops if memory usage climbs steadily.
To capture and log event crashes across an entire application without losing track of your code’s execution flow, implement a centralized error architecture using Building a Global Error Handler: The Err.Number and Err.Description guide.