当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
-
您不需要工作表名称。 据了解,代码将在当前表格上运行, 除非您试图使用另一个表格作为参考。 是“testpage”的Activesheet名称或是不同的工作表?
-
每当您使用
Worksheet_Change
事件。 如果要将数据写入单元,请始终Off
事件。 这是必需的,以便代码不会进入可能的无限循环 -
无论何时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逐步执行。