VBA子例程可访问的堆栈大小是否有内存限制?
由于一些奇怪的原因,当我Dim
6个或更多Range
个变量时,我得到的错误是堆栈中没有空间。
我可以看到Range
是内存密集型的,尤其是我正在使用的较大的非连续的,但我很好奇是否有最好的做法来避免错误。
示例:
Dim RR As Range
'Dim TestArea As Range
'Dim foremenList As Range
'Dim workerList As Range
'Dim workers As Range
'Dim Foremen As Range
Dim i As Integer
Dim R As Range
Dim EmplList(0 To 100) As Variant
'Set TestArea = Sheet90.Range("b4:q8, b15:q19, b26:q30")
'Set foremenList = Sheet90.Range("V24:V30")
Set RR = Sheet90.Range("v24:x45")
i = 0
如果我取消注释这些声明,我就会收到错误。如果我留下他们的评论,我不会。
子中唯一的其他代码是:
For Each R In RR.Cells
If Len(R.Value) > 0 Then
'EmplList(i) = R.Value
i = i + 1
End If
Next R
Sheet90.Range("b40").Value = "Test3"
作为参考,这是在具有8GB RAM的Windows 7笔记本电脑上在Excel 2010中运行的Excel VBA。不是怪物,也不是slouchbox。
答案 0 :(得分:3)
我测试时无法获取Len
语句来触发事件,但代码中的一行肯定会触发_Change
事件:
Sheet90.Range("b40").Value = "Test3"
这将驱动无限循环,因为每次将值赋给B40
时,会再次触发更改事件,并再次触发......
答案 1 :(得分:2)
正如@David Zemens和我在评论中指出的那样,像Sheet90.Range("b40").Value = "Test3"
这样的陈述看起来很无辜但实际上却引发了事件。
另外需要注意的是:某些语句会触发“双重事件”,例如拖放。它实际上是由一个动作触发的两个事件。在这种情况下,在拖动之后,会触发事件,执行放置并重新触发事件。这种(拖放)让我在过去痛苦。
编辑:我的初始陈述错误地引用Len(R.Value) > 0
,这不会触发重新计算。这是触发重新计算的最后一行。感谢大卫指出!