#excel #vba
Вопрос:
Мой проект рос в течение года и теперь состоит из 19 стандартных модулей, 7 модулей класса, 11 форм. Некоторые формы, по-видимому, зависают при вызове, но на самом деле они просто медленно реагируют, занимая пару минут, независимо от того, что нажато (просто изменение фокуса или запуск процедуры события). При перезагрузке формы снова работают нормально.
Проблема сначала возникла с формой, которая отображает PDF-файл в отдельном окне. Затем недомогание начало влиять на другие формы, даже очень простые, такие как та, в которую входит свидание. И недавно — после того, как я добавил еще 4 класса — простая перезагрузка значительно сокращает время отклика формы, вызывающей Acrobat, но не лечит его полностью. Время отклика сокращается с минут до секунд.
Я пришел к выводу, что проблема вызвана управлением памятью. Я утверждаю, что VBA не в состоянии держать весь код под рукой, и задержка вызвана перемещением его частей с переднего плана на задний план. Форма, вызывающая Acrobat Reader, лидирует, потому что она это делает.
Это 64-разрядная машина Win10 с процессором Inspiron 3670 с 8 ГБ установленной оперативной памяти (7,83 ГБ для использования). Я использую Excel 365, и это нормально, что интернет-браузер должен быть открыт одновременно (в настоящее время Edge) плюс веб-приложение для торговли акциями, которое, вероятно, является большим. Однако я не почувствовал никакой разницы в поведении моих форм Excel VBA из-за того, что одновременно открывались другие приложения. Проблема, по-видимому, содержится в Excel, вероятно, в этой книге.
В моей рабочей книге не так много данных. Все листы в среднем содержат менее 1000 строк * 15 столбцов. В моей программе есть большое количество (возможно, 120) публичных перечислений. Все публичные процедуры находятся в стандартных или классовых модулях. Формы выгружаются и уничтожаются ( Set MyForm = Nothing
), когда они выходят из употребления. Классы намеренно сохраняются, но я считаю, что их требование к памяти является верхушкой айсберга.
Мой вопрос в том, где искать решение.
Возможно, мне не следует делать процедуры закрытыми, когда это возможно? Неправильно ли позволять формам ссылаться на публичные процедуры в стандартных модулях кода? Должен ли я удалять комментарии? Или мне следует поискать способы разделить свою рабочую книгу на несколько автономных взаимосвязанных блоков? Или, может быть, VBA просто не в своей тарелке в проекте такого размера?
Логически, если процесс, занимающий долю секунды, выполняется в 1000 раз медленнее (в течение нескольких секунд), VBA может изменять выполнение кода в памяти. Но время, которое требуется, может быть увеличено еще в 1000 раз (до нескольких минут) только в том случае, если процессор работает в бесполезных циклах. Что-то должно вызывать такие петли, и что-то другое должно их заканчивать. Возможно, мне удастся отбить охоту к первому и побудить ко второму. Есть какие-нибудь предложения?