Как предотвратить аварийное завершение Excel при запуске макроса на большой файл? - PullRequest
0 голосов
/ 04 декабря 2018

Добрый день,

Я запускаю макрос, который копирует данные в другую книгу и автоматически сохраняет эту книгу.Проблема в том, что каждая строка содержит изображение, что делает его довольно большим файлом, до 30 МБ.Поэтому выполнение кода занимает некоторое время, и когда я пытаюсь запустить его снова, Excel полностью зависает, и я вынужден закрыть его.Когда я копирую меньше строк, он остается стабильным.Мне было интересно, если это проблема с буфером обмена, но это не так.Как получилось, я могу запустить его только один раз?Это проблема с кешем или что-то?Я уже использую сжатые изображения и application.screenupdating & enablevents = false.

Заранее спасибо

Приведенный ниже код вызывает зависание, в основном каждое изображение после строки 6 необходимо изменить.

    For Each pic In Ws3.Pictures
pic.Select
 If Selection.TopLeftCell.Row > 6 Then
 With Selection
.Height = .TopLeftCell.RowHeight * 0.9
.Width = .Height * PicWtoHRatio
.Top = .TopLeftCell.Top + (.TopLeftCell.RowHeight - .Height) / 2
.Left = .TopLeftCell.Left + (.TopLeftCell.Width - .Width) / 2
End With
End If
Next pic
End Sub

проблема также возникает в другой части кода, всякий раз, когда я пытаюсь скопировать-вставить> 100 строк, Excel, кажется, зависает.я использую cutcopy = False.

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018

Вы также можете отключить автоматический расчет.

Application.Calculation = xlCalculationManual
...
...
...
Application.Calculation = xlCalculationAutomatic

Это может быть полезно!

Если вы работаете с большими файлами Excel, то у вас должно быть мощное аппаратное и программное обеспечение.

64-разрядная версия Excel лучше работает с большими файлами.

0 голосов
/ 04 декабря 2018

Я столкнулся с подобной проблемой, когда у меня есть 20 сводных таблиц в одном файле, который ссылается на 20 различных других файлов и нуждается в обновлении.Я не могу избежать сбоев, так как Excel зависнет при использовании памяти объемом 1,3 ГБ.

  1. Отключите автоматический расчет, если у вас действительно нет расчетов

  2. Внутри цикла выполняйте что-то вроде activeworkbook.save каждую итерацию.сохранение файла поможет очистить некоторую память, но, поскольку ваш файл занимает 30 МБ, это может не сильно помочь решить проблему.

Так что вам также нужно будет сделать:

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

Однако, если ваш код достигнет предела в каждом цикле (сбой при каждой итерации), тогда мой ответне будет работать ни один, нужно будет оптимизировать код.

0 голосов
/ 04 декабря 2018

Если вы используете цикл, вы можете добавить DoEvents в начале каждой итерации.Это дает Excel время для обработки пользовательских событий, а не для замораживания.

While condition
    DoEvents
    ...
Wend
...