1

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。不是怪物,但也不是懒人。

4

2 回答 2

3

当我测试它时,我无法获得Len触发事件的语句,但是代码中的另一行肯定会触发_Change事件:

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

这将驱动一个无限循环,因为每次它为 分配一个值时B40,都会再次触发更改事件,一次又一次......

于 2013-09-05T18:44:56.720 回答
2

正如@David Zemens 和我在评论中指出的那样,Sheet90.Range("b40").Value = "Test3"看似无辜的陈述实际上会触发事件。

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

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

于 2013-09-05T18:16:52.243 回答