Why MS Excel crashes and closes during Worksheet_Change Sub procedure?

前端 未结 3 1396
暗喜
暗喜 2020-11-21 04:45

I am having a problem with Excel crashing, when I run VBA code on an excel sheet.
I\'m trying to add the following formula on worksheet change:

Private S         


        
相关标签:
3条回答
  • 2020-11-21 05:03

    Note: I have been referring people to this link quite often now so I will make this a one stop post for Worksheet_Change. Every now and then, when I get the time, I will add new content to this so people can benefit for it.


    I always recommend this when using Worksheet_Change

    1. You do not need the sheet name. It is understood that the code is to be run on current sheet UNLESS you are trying to use another sheet as a reference. Is "testpage" the Activesheet name or is it a different sheet?

    2. Whenever you are working with Worksheet_Change event. Always switch Off events if you are writing data to the cell. This is required so that the code doesn't go into a possible endless loop

    3. Whenever you are switching off events, use error handling else if you get an error, the code will not run the next time.

    Try this

    Private Sub Worksheet_Change(ByVal Target As Range)
        On Error GoTo Whoa
    
        Application.EnableEvents = False
    
        Range("A1:A8").Formula = "=B1+C1"
    
    Letscontinue:
        Application.EnableEvents = True
        Exit Sub
    Whoa:
        MsgBox Err.Description
        Resume Letscontinue
    End Sub
    

    Few other things that you may want to know when working with this event.

    If you want to ensure that the code doesn't run when more than one cell is changed then add a small check

    Private Sub Worksheet_Change(ByVal Target As Range)
        '~~> For Excel 2003
        If Target.Cells.Count > 1 Then Exit Sub
    
        '
        '~~> Rest of code
        '
    End Sub
    

    The CountLarge was introduced in Excel 2007 onward because Target.Cells.Count returns an Integer value which errors out in Excel 2007 becuase of increased rows/columns. Target.Cells.CountLarge returns a Long value.

    Private Sub Worksheet_Change(ByVal Target As Range)
        '~~> For Excel 2007
        If Target.Cells.CountLarge > 1 Then Exit Sub
        '
        '~~> Rest of code
        '
    End Sub
    

    To work with all the cells that were changed use this code

    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim aCell As Range
    
        For Each aCell In Target.Cells
            With aCell
                '~~> Do Something
            End With
        Next
    End Sub
    

    To detect change in a particular cell, use Intersect. For example, if a change happens in Cell A1, then the below code will fire

    Private Sub Worksheet_Change(ByVal Target As Range)
        If Not Intersect(Target, Range("A1")) Is Nothing Then
            MsgBox "Cell A1 was changed"
            '~~> Your code here
        End If
    End Sub
    

    To detect change in a particular set of range, use Intersect again. For example, if a change happens in range A1:A10, then the below code will fire

    Private Sub Worksheet_Change(ByVal Target As Range)
        If Not Intersect(Target, Range("A1:A10")) Is Nothing Then
            MsgBox "Cell in A1:A10 range was changed"
            '~~> Your code here
        End If
    End Sub
    
    0 讨论(0)
  • 2020-11-21 05:14

    Also this solution is good:

    Option Explicit
    Private Busy As Boolean
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Not Busy Then
            Busy = True
            Range("A1:A8").Formula = "=B1+C1"
            Busy = False
        End If
    End Sub
    
    0 讨论(0)
  • 2020-11-21 05:23

    Excel was crashing, not the VBA function.
    The events were not disabled and the call stack was filled by an infinite loop of OnChange events.
    A little advice that helps finding this type of errors: set a breakpoint on the first line of the event, then execute it step by step pressing F8.

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