2013-09-05 2 views
1

Есть ли ограничение на размер стека, доступного для подпрограмм VBA?Пределы памяти подпрограмм в VBA

По какой-то нечетной причине, когда I 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" 

Для справки это Excel VBA работает в Excel 2010 на Windows 7 ноутбук с 8 Гб оперативной памяти. Не монстр, но и не сумочка.

+2

Никогда не видели этого и часто использовали больше диапазонов, чем 6 ... Что-то еще вероятно, проблема. –

+3

Вы используете какие-либо глубокие рекурсии в своем суб? –

+0

Нет рекурсии, одна для цикла. Вопрос отредактирован, чтобы добавить дополнительный код. –

ответ

2

Как @David Zemens и я указал в комментариях, заявления вроде Sheet90.Range("b40").Value = "Test3" выглядят невинными, но фактически запускают события.

Еще одно замечание: некоторые утверждения вызывают «двойные события», такие как перетаскивание. Фактически это два события, вызванных одним действием. В этом случае, после перетаскивания, события увольняются, капля выполняется и события перезапускаются. Это (перетаскивание) вызвало у меня боль в прошлом ..

EDIT: Мое первое заявление было ошибочно ссылаясь на Len(R.Value) > 0, который не вызвать перерасчет. Это последняя строка, которая вызывает перерасчет. Спасибо Давиду за указание!

3

Я не в состоянии получить Len заявление, чтобы вызвать событие, когда я проверить это, но линия дальше в коде, конечно, вызовет _Change событие:

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

Это возбуждающие бесконечный цикл, так как каждый раз это присваивает значение B40, событие изменения запускается снова, и снова и снова ...

+0

Вы правы, я поставил точку разрыва в неправильную строку :) 'R.Value' не вызывает пересчет, я отредактирую свой ответ. – Ioannis

Смежные вопросы