Недостаточно места в стеке (ошибка 28)

Стек — это рабочая область памяти, динамически увеличивающаяся и уменьшающаяся в соответствии с потребностями выполняемой программы. Эта ошибка имеет следующие причины и способы решения:

  • Активно слишком много вызовов процедур Function, Sub или Property. Убедитесь, что процедуры не вложены друг в друга слишком глубоко. Будьте особенно внимательны к рекурсивным процедурам, то есть процедурам, которые вызывают сами себя. Обеспечьте правильное завершение рекурсивных процедур. Используйте диалоговое окно Вызовы, чтобы просмотреть активные процедуры (для стека).

  • Локальные переменные требуют больше пространства, чем доступно для локальных переменных.

    Попробуйте объявить некоторые переменные на уровне модуля. Можно также объявить все переменные в процедуре статическими, помещая перед ключевым словом Property, Sub или Function слово Static. Либо можно использовать оператор Static, чтобы объявить в процедурах отдельные переменные как статические.

  • Используется слишком много строк фиксированной длины. Строки фиксированной длины в процедуре обеспечивают более быстрый доступ, но они занимают в стеке больше места, чем строки переменной длины, так как данные строки полностью помещаются в стек. Попробуйте переопределить часть строк фиксированной длины как строки переменной длины. При объявлении в процедуре строк переменной длины в стек помещается только дескриптор строки (а не сами данные). Можно также определить строку на уровне модуля — в этом случае она не занимает места в стеке. Переменные, объявленные на уровне модуля, по умолчанию являются общедоступными (Public), поэтому строка видна всем процедурам в модуле.

  • Слишком много вложенных вызовов функции DoEvents. Используйте диалоговое окно Вызовы, чтобы просмотреть процедуры, активные для стека.

  • Код вызвал каскад событий. Каскад событий создается событием, которое вызывает процедуру события, уже находящуюся в стеке. Каскад событий похож на вызов незавершенной рекурсивной процедуры, но он менее очевиден, так как этот вызов выполняется Visual Basic, а не с помощью явного вызова в коде. Используйте диалоговое окно Вызовы, чтобы просмотреть активные процедуры (для стека).

Для вывода на экран диалогового окна Вызовы нажмите кнопку Вызовы справа от поля процедуры в диалоговом окне Отладка или выберите команду Вызовы. Для получения дополнительной информации выберите необходимый элемент и нажмите клавишу F1 (для Windows) или HELP (для Macintosh).

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.