Макро работает медленно, но шагает быстро

Фредрик написал о проблеме, с которой он столкнулся с макросом. Когда он запускает макрос в редакторе VB с помощью F8 (пошаговое выполнение макроса), он выполняется всего за несколько минут. Когда он запускает макрос сразу, кажется, что он запускается бесконечно, часто на выполнение требуется 20 минут или больше. Несмотря на то, что рабочая тетрадь Фредрика велика (46 МБ), разница во времени между двумя методами выполнения вызывает утомление.

Подобные проблемы могут сбивать с толку, и для их устранения часто требуется серьезный анализ. выяснить. Хорошее место для начала – добавить в макрос «код таймера». Добавьте небольшую процедуру, которая сохраняет значение времени, и другую процедуру, которая сравнивает это сохраненное значение с текущим временем и отображает разницу. В начале раздела кода, который вы хотите проанализировать, вы вызываете первую процедуру (которая сохраняет время начала), а затем в конце раздела кода вызываете вторую процедуру. Таким образом вы можете определить, какие части вашего кода выполняются дольше всего. Это те разделы кода, на которых вы затем сосредотачиваетесь, чтобы вы могли понять, что они делают, на что уходит так много времени.

Еще нужно убедиться, что вы добавили эти две строки в начало вашего макрос:

Application.ScreenUpdating = FalseApplication.EnableEvents = False

Они отключают обновление экрана, которое может замедлить выполнение макроса, и отключать события. Эта последняя строка включена, чтобы изменения, сделанные макросом на вашем листе, не запускали процедуры пересчета Excel. Если ваш макрос вносит много изменений в данные на листе, и после каждого изменения запускается полный пересчет, то с такой большой книгой много-много времени можно потратить просто на пересчет. В конце макроса вы отменяете эффект двух добавленных вами строк:

Application.EnableEvents = TrueApplication.ScreenUpdating = True

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

Application.Calculation = xlCalculationManual

Рекомендуется отключить автоматический расчет в макрос, только если ваш макрос не полагается на вычисленную информацию на листе. Если вы отключите его, вы можете позже снова включить автоматический расчет, поместив следующую строку в конце макроса:

Application.Calculation = xlCalculationAutomatic

Один из читателей предложил сосредоточить внимание на другом приложении, пока макрос работает на листе Excel. Например, откройте Блокнот и сделайте это окно активным. Макрос должен значительно ускориться, когда Excel больше не активен.. Другой вариант – переместить указатель мыши вниз в область панели задач вместо того, чтобы располагать его на активном листе Excel.

Источник: frestage.ru

Бытовой вопрос