堆栈空间和对象范围错误的值

时间:2016-06-09 22:05:51

标签: excel vba excel-vba

我正在尝试在对工作表进行更改后对数据进行求和。包含数据的列在第1行中包含文本。

我第一次测试时,我得到了

  

运行时错误' 28':堆栈空间不足

第二次测试时,我得到了

  

运行时错误' -2147417848(80010108)':方法'价值'对象   '范围'失败,然后Excel崩溃。

Sub Worksheet_Change(ByVal Target As Range)

Dim LastCol As Integer
Dim NumProjects As Integer
Dim i As Integer

With ActiveSheet
    LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
End With

NumProjects = LastCol - 5

For i = 1 To NumProjects
    Range("E44").Offset(0, i).Value = WorksheetFunction.Sum(Range("E2").Offset(0, i), Range("E43").Offset(0, i))
Next i

End Sub

2 个答案:

答案 0 :(得分:2)

您正在更改Worksheet_Change事件中的单元格值。此更改会导致Worksheet_Change事件再次触发,并一直这样做,直到Excel崩溃。

要解决此问题,您需要禁用然后重新启用事件:

Sub Worksheet_Change(ByVal Target As Range)

Application.EnableEvents = False

' do stuff

Application.EnableEvents = True

End Sub

答案 1 :(得分:0)

您的代码存在的问题是您正在使用Worksheet_Change事件。当用户更改工作表上的值时,您的宏将放在进程堆栈上。然后你的宏改变了20?将20个宏的副本放在堆栈上的值。然后这20个副本改变400个值,在堆栈上放置400个新副本。在你知道你的堆栈空间之前。繁荣!!!使用Worksheet_SelectionChange可能会为您提供所需的结果,并且不会导致Worksheet_Change的递归。

无论如何,使用数组公式会更有效率。运行此代码一次以插入数组公式。

Sub insertArrayFormula()
    Application.ScreenUpdating = False
    Dim LastCol As Integer
    With ActiveSheet
        LastCol = .Cells(1, .Columns.count).End(xlToLeft).Column - 5
        Range(Cells(44, 5), Cells(44, LastCol)).FormulaArray = "=Sum($E$2:$E$43)"
    End With
    Application.ScreenUpdating = True
End Sub