Макрос работает медленно, но шагает быстро (Microsoft Excel)
Фредрик написал о проблеме, с которой он столкнулся с макросом. Когда он запускает макрос в редакторе VB с помощью F8 (пошаговое выполнение макроса), он завершается всего за несколько минут. Когда он запускает макрос сразу, кажется, что он выполняется бесконечно, часто на выполнение требуется 20 минут или больше. Несмотря на то, что рабочая тетрадь Фредрика велика (46 МБ), разница во времени между двумя методами бега утомляет.
Подобные проблемы могут сбивать с толку, и для их решения часто требуется серьезный анализ. Хорошее место для начала — добавить в макрос «код таймера». Добавьте небольшую процедуру, которая сохраняет значение времени, и другую процедуру, которая сравнивает это сохраненное значение с текущим временем и отображает разницу. В начале раздела кода, который вы хотите проанализировать, вы вызываете первую процедуру (которая сохраняет время начала)
а затем в конце раздела кода вы вызываете вторую процедуру.
Таким образом вы можете определить, какие части вашего кода выполняются дольше всего. Это те разделы кода, на которых вы затем сосредотачиваетесь, чтобы вы могли понять, что они делают, что занимает так много времени.
Другое дело — убедиться, что вы добавили эти две строки в начало макроса:
Application.ScreenUpdating = False Application.EnableEvents = False
Они отключают обновление экрана, что может замедлить выполнение макроса, и отключать события. Эта последняя строка включена, чтобы изменения, сделанные макросом на вашем листе, не запускали процедуры пересчета Excel. Если ваш макрос вносит много изменений в данные на листе, и после каждого изменения запускается полный пересчет, то с такой большой книгой можно потратить много-много времени, просто делая пересчет. В конце макроса вы отменяете эффект двух добавленных вами строк:
Application.EnableEvents = True Application.ScreenUpdating = True
Вы также можете отключить автоматический расчет во время выполнения макроса. Это гарантирует, что Excel не пытается вычислить промежуточные результаты, пока макрос перемещает объекты или иным образом работает с данными. Чтобы отключить автоматический расчет, используйте эту строку в начале макроса:
Application.Calculation = xlCalculationManual
Отключать автоматическое вычисление в макросе рекомендуется только в том случае, если макрос не полагается на вычисленную информацию на листе. Если вы выключите его, вы сможете позже снова включить автоматический расчет, поместив следующую строку в конце макроса:
Application.Calculation = xlCalculationAutomatic
Один из читателей предложил сосредоточить внимание на другом приложении, пока макрос работает на листе Excel. Например, откройте Блокнот и сделайте это окно активным. Макрос должен значительно ускориться, когда Excel больше не активен. Другой вариант, который можно попробовать — переместить указатель мыши вниз в область панели задач, а не на активный лист Excel.
_Примечание: _
Если вы хотите узнать, как использовать макросы, описанные на этой странице (или на любой другой странице на сайтах ExcelTips), я подготовил специальную страницу, содержащую полезную информацию.
link: / excelribbon-ExcelTipsMacros [Щелкните здесь, чтобы открыть эту специальную страницу в новой вкладке браузера]
.
ExcelTips — ваш источник экономичного обучения Microsoft Excel.
Этот совет (818) применим к Microsoft Excel 2007, 2010, 2013, 2016, 2019 и Excel в Office 365. Вы можете найти версию этого совета для старого интерфейса меню Excel здесь:
link: / excel-Macro_Runs_Slowly_but_Steps_Quickly [макрос работает медленно, но шагает быстро]
.