2016-06-09 31 views
1

我试图在对工作表进行更改后对数据进行求和。包含数据的列具有文本第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 
+0

你有多少列?尝试声明'NumProjects和LastCol只要'。 – findwindow

+0

它看起来像你的'For'循环正在做:F44 = F2 + F43; G44 = G2 + G43; ...达到NumProjects。如果这就是你的意图,那么在第2或第43行有非数字数据可能会导致问题。顺便说一句,不要调用'WorksheetFunction.Sum',而只需添加两个数字:'.Value = Range(“E2”)。Offset(0,i)+ Range(“E43”)。Offset(0,i )' – xidgel

+1

@xidgel - 我认为总和是公式语法错误。 OP可能想要求和范围(“E2:E43”)的范围,偏移量(0,i)'。 – Jeeped

回答

2

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

为了避开这一点,你需要禁用,然后重新启用事件:

Sub Worksheet_Change(ByVal Target As Range) 

Application.EnableEvents = False 

' do stuff 

Application.EnableEvents = True 

End Sub 
+1

这是有效的,但我认为值得警告OP,这也意味着他可能依赖的其他事件也不会触发。 – Enigmativity

+0

谢谢!我也不得不改变我的方法来找到总和的范围,但我知道了。 –

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