Я запускаю код VBA на большой электронной таблице. Как очистить память между процедурами/вызовами, чтобы предотвратить возникновение проблемы "из памяти"?
Спасибо
Я запускаю код VBA на большой электронной таблице. Как очистить память между процедурами/вызовами, чтобы предотвратить возникновение проблемы "из памяти"?
Спасибо
Лучший способ помочь освободить память - это аннулировать большие объекты:
Sub Whatever()
Dim someLargeObject as SomeObject
'expensive computation
Set someLargeObject = Nothing
End Sub
Также обратите внимание, что глобальные переменные остаются выделенными от одного вызова другому, поэтому, если вам не нужна настойчивость, вам не следует использовать глобальные переменные или аннулировать их, когда они вам больше не нужны.
Однако это не поможет, если:
Еще одна возможность - перейти на 64-разрядную версию Excel, которая должна иметь возможность использовать больше оперативной памяти перед сбоем (32-разрядные версии обычно ограничены примерно 1,3 ГБ).
Я нашел обходное решение. Поначалу казалось, что потребуется больше времени, но на самом деле все становится более плавным и быстрым из-за меньшего количества обмена и доступной памяти. Это не научный подход, и он нуждается в некотором тестировании, прежде чем он будет работать.
В коде сделайте Excel время от времени сохраняйте книгу. Мне пришлось пройти через лист с 360 000 строк, и он сильно задохнулся. После каждых 10 000 я сделал код, сохраняя книгу, и теперь он работает как шарм даже в 32-разрядном Excel.
Если вы запустите диспетчер задач одновременно, вы можете увидеть, что использование памяти резко падает после каждого сохранения.
Ответ: вы не можете явно, но вы должны освобождать память в своих подпрограммах.
Некоторые советы, однако, чтобы помочь памяти
Я бы рекомендовал проверить использование памяти после выполнения процедуры снова и снова, у вас может быть утечка памяти.
Если вы работаете с большим набором данных, очень возможно, что массивы будут использоваться. Для меня это создало несколько массивов из 500 000 строк и 30 столбцов. Я решил это просто, используя приведенную ниже строку, чтобы избавиться от массива, который больше не нужен мне, прежде чем создавать еще один:
Erase vArray
Также, если используется только 2 столбца из 30, рекомендуется создать два массива с 1 столбцом вместо одного с 30 столбцами. Это не влияет на скорость, но будет разница в использовании памяти.
У меня была аналогичная проблема, с которой я решил... Я думаю, что это был частично мой код, забивающий слишком много памяти, в то время как слишком много "больших вещей"
в моем приложении - рабочая книга выходит и захватывает другие ежедневные отчеты отделов... и я извлекаю всю информацию, необходимую нашей команде (чтобы свести к минимуму ошибки и ввод данных).
Я прячу их листы напрямую... но я ненавижу тот факт, что они используют Merged cells..., от которых я избавляюсь (то есть unmerge, затем нахожу полученные пустые ячейки и заполняю значения сверху)
Я поставил свою проблему на
a), не смешивая только "используемые ячейки", а не просто пытается сделать целую колонку... т.е. нахожу последнюю использованную строку в столбце и снимая только этот диапазон (буквально 1000 строк на каждом из лист я хватаю)
b) Зная, что отмена только смотрит за последними ~ 16 событиями... между каждым "unmerge" - я помещаю 15 событий, которые очищают то, что хранится в "undo", чтобы свести к минимуму объем памяти (вверх) т.е. перейдите в какую-либо ячейку с данными в ней.. и скопируйте//вставьте специальное значение... Я УВЕРЕН, что накопленная сумма в 30 листов, каждая из которых содержит 3 столбца, может облагать память, установленную как часть для отмены
Да, это не допускает никаких шансов на отмену... но вся цель состоит в том, чтобы очистить старую информацию и вытащить новые чувствительные к времени данные для анализа, чтобы это не было проблемой.
Звук банальный - но моя проблема ушла