Ошибка VBA: недостаточно места в стеке

996
PeterH

У меня есть очень простой макрос на листе Excel, который позволяет пользователям пересчитывать.

У меня нет других макросов / кода в рабочей книге, и только эта рабочая книга открыта

Sub Calculate() Calculate End Sub 

Это активируется кнопкой.

Однако при нажатии я получаю два окна с ошибками, см. Изображение.

Что делает Out of stack space mean? И как мне решить эту проблему? enter image description here

Я посмотрел на этом сайте:

https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/out-of-stack-space-error-28

Там написано, что у меня слишком много функций. Этот макрос работал нормально, и вряд ли он много делает, поэтому не может понять проблему.

Я могу рассчитать лист, используя опцию на вкладке формул.

0
Вы написали реентерабельную функцию, которая безоговорочно вызывает себя, не ограничивая условия, поэтому она заполнит стек повторными вызовами. Чего ты надеешься достичь? AFH 5 лет назад 1
@AFH все, что нужно сделать макросу, - это вычислить лист, пользователь вводит новую дату, а затем нажимает кнопку обновления, чтобы пересчитать. пользователь может быть не очень опытным, поэтому я использовал макрос / кнопку, так как вы не можете пропустить его тогда. PeterH 5 лет назад 1
Не видя основной код, было бы трудно дать однозначный ответ относительно прямой причины, поскольку может быть несколько причин - рекурсивная функция, переменные, занимающие слишком много памяти. Согласно вашей ссылке, стек - это область выделенной рабочей памяти, и когда вы выполняете ваш макрос, переменные и вызовы, которые он делает, «помещаются» в стек. Когда функция или переменная больше не требуется, она удаляется из стека, освобождая память. Ошибка предполагает, что ваш макрос может превышать выделенную память для стека. Enigman 5 лет назад 0
@ Enigman единственный код, используемый в документе, показан в вопросе, у меня нет других макросов, поэтому я так озадачен этим. PeterH 5 лет назад 0

2 ответа на вопрос

5
AFH

Функция, которую вы определили, является рекурсивной, вызывая себя безоговорочно, пока стек не будет заполнен всеми вызовами.

Вы должны изменить название вашей подпрограммы, например: -

Sub Calc() Calculate End Sub 

Если вы ссылаетесь Calc()на кнопку, вы избегаете любой рекурсии.

это решило проблему, спасибо!, хотя все еще немного сбит с толку, поскольку проблема только началась сегодня и работала нормально в течение последних нескольких недель. PeterH 5 лет назад 0
Я не могу объяснить, как это работало раньше, если только другая ревизия не обработала вызовы по-другому. AFH 5 лет назад 0
4
Enigman

Вы звоните Рассчитать внутри Рассчитать. Каждый вызов Calculate вызывает другой вызов Calculate, который затем вызывает Calculate ... Затем, в конце концов, вы получите эту ошибку, когда стек заполнится.

так функция вычисления в коде, заставьте мой макрос пересчитать также? Я использую этот же макрос в других книгах без проблем PeterH 5 лет назад 0
@PeterH Тебе, возможно, повезло до сих пор, что это не проявилось раньше. Возможно, в стеке было больше места в других случаях - возможно, на этот раз на рабочей станции работало больше приложений, или между перезагрузками рабочей станции прошло больше времени. Вот почему мы должны быть осторожны при использовании имен для модулей и функций, так как использование зарезервированного слова или имени встроенной функции может укусить нас позже, как было в этой ситуации. Enigman 5 лет назад 1
Ну, в любом случае, спасибо за вашу помощь, я не осознавал, что название функции действительно имеет значение, если честно PeterH 5 лет назад 0

Похожие вопросы