Недостаточно места в стеке (ошибка 28)
Стек — это рабочая область памяти, динамически увеличивающаяся и уменьшающаяся в соответствии с потребностями выполняемой программы. Эта ошибка имеет следующие причины и способы решения:
Активно слишком много вызовов процедур Function, Sub или Property. Убедитесь, что процедуры не вложены друг в друга слишком глубоко. Будьте особенно внимательны к рекурсивным процедурам, то есть процедурам, которые вызывают сами себя. Обеспечьте правильное завершение рекурсивных процедур. Используйте диалоговое окно Вызовы, чтобы просмотреть активные процедуры (для стека).
Локальные переменные требуют больше пространства, чем доступно для локальных переменных.
Попробуйте объявить некоторые переменные на уровне модуля. Можно также объявить все переменные в процедуре статическими, помещая перед ключевым словом Property, Sub или Function слово Static. Либо можно использовать оператор Static, чтобы объявить в процедурах отдельные переменные как статические.
Используется слишком много строк фиксированной длины. Строки фиксированной длины в процедуре обеспечивают более быстрый доступ, но они занимают в стеке больше места, чем строки переменной длины, так как данные строки полностью помещаются в стек. Попробуйте переопределить часть строк фиксированной длины как строки переменной длины. При объявлении в процедуре строк переменной длины в стек помещается только дескриптор строки (а не сами данные). Можно также определить строку на уровне модуля — в этом случае она не занимает места в стеке. Переменные, объявленные на уровне модуля, по умолчанию являются общедоступными (Public), поэтому строка видна всем процедурам в модуле.
Слишком много вложенных вызовов функции DoEvents. Используйте диалоговое окно Вызовы, чтобы просмотреть процедуры, активные для стека.
Код вызвал каскад событий. Каскад событий создается событием, которое вызывает процедуру события, уже находящуюся в стеке. Каскад событий похож на вызов незавершенной рекурсивной процедуры, но он менее очевиден, так как этот вызов выполняется Visual Basic, а не с помощью явного вызова в коде. Используйте диалоговое окно Вызовы, чтобы просмотреть активные процедуры (для стека).
Для вывода на экран диалогового окна Вызовы нажмите кнопку Вызовы справа от поля процедуры в диалоговом окне Отладка или выберите команду Вызовы. Для получения дополнительной информации выберите необходимый элемент и нажмите клавишу F1 (для Windows) или HELP (для Macintosh).
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.