2009-11-21 4 views
5

Есть ли способ принудительного сбора мусора в VBA/Excel 2000?Принудительная сборка мусора

Этот вопрос относится к языку макросов в Excel. Не использовать VB .NET для управления Excel. Таким образом, GC.collect() не будет работать

ответ

11

Вы не можете воспользоваться сборкой мусора, предоставляемой платформой .NET Framework при использовании прямого VBA. Perhaps this article от Eric Lippert будет полезен

+1

Я не знал, что VBA использовал подсчет ссылок и не поддерживал очистку круговых ссылок. Это может быть проблема, лежащая в основе. Исходная проблема заключалась в том, что иногда книги не закрывались правильно, когда закрывались и де-ссылки в классах деструкторов. Я думал, что проблема связана с тем, что объект еще не был собран. Скорее всего, у меня есть циркулярная ссылка на несколько сывороток, которые вступают в игру несколько раз. Спасибо за совет. – Zen

+0

Согласен, вы не можете делать это прямо из VBA. Но на самом деле вы можете использовать GC .NET, если вы ссылаетесь на библиотеку COM. См. [** мой ответ **] (http://stackoverflow.com/questions/20398477/how-to-set-application-name-in-adodb-connection-string/20406284#20406284), в частности часть о '.Dispose()' вызван из VBA. – 2014-02-03 12:50:58

3

VBA/Excel не содержит сборку мусора, как старый VB. Вместо GC он использует подсчет ссылок. Память освобождается, когда вы устанавливаете указатель на ничто (или когда переменная выходит за пределы области видимости). Как и в старых VB, это означает, что круговые ссылки никогда не освобождаются.

+0

Пример известной проблемы здесь: https://support.microsoft.com/en-us/help/280454/password-prompt-for-vba-project-appears-after-excel-quits –

3

Вы не можете принудительно выполнить GC в VBA, но хорошо установить значение Nothing для глобальных переменных.

В статье, упомянутой kd7, говорится, что бесполезно устанавливать переменные Nothing в локальные переменные до того, как они выйдут из области видимости, но не говорят о глобальных переменных.

В VBA глобальные переменные, определенные в модуле, остаются в живых через весь сеанс Excel, то есть до тех пор, пока документ, содержащий модуль VBA, который их не будет закрывать.

Так что не помещайте бесполезно Set O = Nothing, когда O является локальным, но выполняйте его, когда он является глобальным.

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