当VBA代码运行时,MS Excel崩溃

我在excel表单上运行VBA代码时遇到了excel崩溃的问题。 我有一些代码添加一个公式的一个单元格范围如下:

Private Sub Worksheet_Change(ByVal Target As Range) Worksheets("testpage").Range("A1:A8").Formula = "=B1+C1" End Sub 

当这个代码运行时,我收到一条消息,说“ Excel遇到问题,需要closures ”,Excelclosures。

如果我运行worksheet_active()类中的代码,它工作正常,不会崩溃

 Private Sub Worksheet_Activate() Worksheets("testpage").Range("A1:A8").Formula = "=B1+C1" End Sub 

但我真的需要它在worksheet_change()类中工作。

有没有人在使用worksheet_change()类时遇到类似的崩溃问题,任何人都可以指出正确的方向来解决这个问题?

注意 :我现在已经经常提到这个链接,所以我将把它作为Worksheet_Change一站式发布。 时不时地,我会为此添加新的内容,这样人们可以从中受益。


我总是build议使用Worksheet_Change

  1. 您不需要工作表名称。 据了解,代码将在当前表格上运行, 除非您试图使用另一个表格作为参考。 是“testpage”的Activesheet名称或是不同的工作表?

  2. 每当您使用Worksheet_Change事件。 如果要将数据写入单元,请始终Off事件。 这是必需的,以便代码不会进入可能的无限循环

  3. 无论何时closures事件,如果出现错误,请使用error handling,否则代码将不会在下一次运行。

尝试这个

 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 

在处理这个事件时,您可能还想知道其他一些事情。

如果你想确保当多个单元格被改变时代码不能运行,那么添加一个小的检查

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

CountLarge是在Excel 2007以后引入的,因为Target.Cells.Count返回一个Integer数值,在Excel 2007中出现错误,包括增加的行/列。 Target.Cells.CountLarge返回一个Long值。

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

要处理所有更改的单元格,请使用此代码

 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 

要检测特定单元格中的更改,请使用Intersect 。 例如,如果在单元格A1发生更改,则下面的代码将会触发

 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 

要检测特定范围内的更改,请再次使用Intersect 。 例如,如果在范围A1:A10发生更改,则下面的代码将会触发

 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 

Excel崩溃了,而不是VBAfunction。
事件没有被禁用,调用堆栈被无限循环的OnChange事件填充。
有一点build议可以帮助find这种types的错误:在事件的第一行设置一个断点,然后按F8逐步执行。