VBA中子例程的内存限制

时间:2013-09-05 17:33:00

标签: excel vba excel-vba

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。

2 个答案:

答案 0 :(得分:3)

我测试时无法获取Len语句来触发事件,但代码中的一行肯定会触发_Change事件:

Sheet90.Range("b40").Value = "Test3"

这将驱动无限循环,因为每次将值赋给B40时,会再次触发更改事件,并再次触发......

答案 1 :(得分:2)

正如@David Zemens和我在评论中指出的那样,像Sheet90.Range("b40").Value = "Test3"这样的陈述看起来很无辜但实际上却引发了事件。

另外需要注意的是:某些语句会触发“双重事件”,例如拖放。它实际上是由一个动作触发的两个事件。在这种情况下,在拖动之后,会触发事件,执行放置并重新触发事件。这种(拖放)让我在过去痛苦。

编辑:我的初始陈述错误地引用Len(R.Value) > 0,这不会触发重新计算。这是触发重新计算的最后一行。感谢大卫指出!