Подтвердить что ты не робот

Как очистить память, чтобы предотвратить "ошибку из памяти" в excel vba?

Я запускаю код VBA на большой электронной таблице. Как очистить память между процедурами/вызовами, чтобы предотвратить возникновение проблемы "из памяти"?

Спасибо

4b9b3361

Ответ 1

Лучший способ помочь освободить память - это аннулировать большие объекты:

Sub Whatever()
    Dim someLargeObject as SomeObject

    'expensive computation

    Set someLargeObject = Nothing
End Sub

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

Однако это не поможет, если:

  • вам нужен объект после процедуры (очевидно)
  • ваш объект не помещается в память

Еще одна возможность - перейти на 64-разрядную версию Excel, которая должна иметь возможность использовать больше оперативной памяти перед сбоем (32-разрядные версии обычно ограничены примерно 1,3 ГБ).

Ответ 2

Я нашел обходное решение. Поначалу казалось, что потребуется больше времени, но на самом деле все становится более плавным и быстрым из-за меньшего количества обмена и доступной памяти. Это не научный подход, и он нуждается в некотором тестировании, прежде чем он будет работать.

В коде сделайте Excel время от времени сохраняйте книгу. Мне пришлось пройти через лист с 360 000 строк, и он сильно задохнулся. После каждых 10 000 я сделал код, сохраняя книгу, и теперь он работает как шарм даже в 32-разрядном Excel.

Если вы запустите диспетчер задач одновременно, вы можете увидеть, что использование памяти резко падает после каждого сохранения.

Ответ 3

Ответ: вы не можете явно, но вы должны освобождать память в своих подпрограммах.

Некоторые советы, однако, чтобы помочь памяти

  • Перед тем, как выйти из вашей процедуры, убедитесь, что объект установлен до нуля.
  • Убедитесь, что вы вызываете объекты Close, если они этого требуют.
  • Не используйте глобальные переменные, если это абсолютно необходимо

Я бы рекомендовал проверить использование памяти после выполнения процедуры снова и снова, у вас может быть утечка памяти.

Ответ 4

Если вы работаете с большим набором данных, очень возможно, что массивы будут использоваться. Для меня это создало несколько массивов из 500 000 строк и 30 столбцов. Я решил это просто, используя приведенную ниже строку, чтобы избавиться от массива, который больше не нужен мне, прежде чем создавать еще один:

Erase vArray

Также, если используется только 2 столбца из 30, рекомендуется создать два массива с 1 столбцом вместо одного с 30 столбцами. Это не влияет на скорость, но будет разница в использовании памяти.

Ответ 5

У меня была аналогичная проблема, с которой я решил... Я думаю, что это был частично мой код, забивающий слишком много памяти, в то время как слишком много "больших вещей"

в моем приложении - рабочая книга выходит и захватывает другие ежедневные отчеты отделов... и я извлекаю всю информацию, необходимую нашей команде (чтобы свести к минимуму ошибки и ввод данных).

Я прячу их листы напрямую... но я ненавижу тот факт, что они используют Merged cells..., от которых я избавляюсь (то есть unmerge, затем нахожу полученные пустые ячейки и заполняю значения сверху)

Я поставил свою проблему на

a), не смешивая только "используемые ячейки", а не просто пытается сделать целую колонку... т.е. нахожу последнюю использованную строку в столбце и снимая только этот диапазон (буквально 1000 строк на каждом из лист я хватаю)

b) Зная, что отмена только смотрит за последними ~ 16 событиями... между каждым "unmerge" - я помещаю 15 событий, которые очищают то, что хранится в "undo", чтобы свести к минимуму объем памяти (вверх) т.е. перейдите в какую-либо ячейку с данными в ней.. и скопируйте//вставьте специальное значение... Я УВЕРЕН, что накопленная сумма в 30 листов, каждая из которых содержит 3 столбца, может облагать память, установленную как часть для отмены

Да, это не допускает никаких шансов на отмену... но вся цель состоит в том, чтобы очистить старую информацию и вытащить новые чувствительные к времени данные для анализа, чтобы это не было проблемой.

Звук банальный - но моя проблема ушла